2010-07-07 4 views
2

J'ai une application iPhone qui charge actuellement un UIWebView en utilisant le graphe facebook api oauth url (https://graph.facebook.com/oauth/authorize?...) - un utilisateur entre alors ses informations de connexion, et en soumettant je récupère le jeton d'accès de l'URL. (D'une manière que je crois http://www.capturetheconversation.com/technology/iphone-facebook-oauth2-graph-api) Ceci est ensuite passé à mon serveur Java qui effectue les différentes actions en utilisant RestFBObtenir la clé oauth de Twitter de façon similaire à la clé oauth de Facebook

Ma question est, est-il une façon similaire de faire cela avec Twitter? Actuellement, il semble que le seul moyen d'obtenir les données est de télécharger une bibliothèque et de l'utiliser; Pourtant, c'est une approche que je préfère ne pas utiliser car cela prendrait de l'espace inutile vu que toutes les commandes seront réellement exécutées à partir de mon serveur Java.

Tout conseil serait grandement apprécié

Merci,

Dan

Répondre

8

Twitter utilise OAuth 1.0a authentication, mais pas OAuth 2.0.

étapes pour obtenir un jeton d'accès sur Twitter:

  1. Créez votre propre application sur Twitter et obtenir la clé et le code secret.
  2. Télécharger la bibliothèque open source OAuth, OAuthConsumer dans mon cas.
  3. Écrivez le code d'enregistrement, voir l'exemple ci-dessous.

p.s. Définir le type d'application en tant qu'application Web, il active le rappel au lieu du code PIN.


static NSString* kMyApplicationConsumerKey = @"XXXXXXXXXXX"; 
static NSString* kMyApplicationConsumerSecret = @"XXXXXXXXXXX"; 


@interface TwitterConnector : NSObject { 
    OAConsumer* consumer; 
    OAToken* requestToken; 
    OAToken* accessToken; 
} 

- (void)start; 

@end 

@implementation TwitterConnector 

- (void)start { 
    consumer = [[OAConsumer alloc] initWithKey:kMyApplicationConsumerKey secret:kMyApplicationConsumerSecret]; 

    NSURL* requestTokenUrl = [NSURL URLWithString:@"http://api.twitter.com/oauth/request_token"]; 
    OAMutableURLRequest* requestTokenRequest = [[[OAMutableURLRequest alloc] initWithURL:requestTokenUrl 
                       consumer:consumer 
                        token:nil 
                        realm:nil 
                     signatureProvider:nil] autorelease]; 
    OARequestParameter* callbackParam = [[[OARequestParameter alloc] initWithName:@"oauth_callback" value:@"twitter://authorized"] autorelease]; 
    [requestTokenRequest setHTTPMethod:@"POST"]; 
    [requestTokenRequest setParameters:[NSArray arrayWithObject:callbackParam]]; 
    OADataFetcher* dataFetcher = [[[OADataFetcher alloc] init] autorelease]; 
    [dataFetcher fetchDataWithRequest:requestTokenRequest 
          delegate:self 
        didFinishSelector:@selector(didReceiveRequestToken:data:) 
         didFailSelector:@selector(didFailOAuth:error:)]; 
} 

- (void)didReceiveRequestToken:(OAServiceTicket*)ticket data:(NSData*)data { 
    NSString* httpBody = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 
    requestToken = [[OAToken alloc] initWithHTTPResponseBody:httpBody]; 

    NSURL* authorizeUrl = [NSURL URLWithString:@"https://api.twitter.com/oauth/authorize"]; 
    OAMutableURLRequest* authorizeRequest = [[[OAMutableURLRequest alloc] initWithURL:authorizeUrl 
                      consumer:nil 
                       token:nil 
                       realm:nil 
                    signatureProvider:nil] autorelease]; 
    NSString* oauthToken = requestToken.key; 
    OARequestParameter* oauthTokenParam = [[[OARequestParameter alloc] initWithName:@"oauth_token" value:oauthToken] autorelease]; 
    [authorizeRequest setParameters:[NSArray arrayWithObject:oauthTokenParam]]; 

    UIWebView* webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    [[[UIApplication sharedApplication] keyWindow] addSubview:webView]; 
    [webView release]; 

    webView.delegate = self; 
    [webView loadRequest:authorizeRequest]; 
} 

- (void)didReceiveAccessToken:(OAServiceTicket*)ticket data:(NSData*)data { 
    NSString* httpBody = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 
    accessToken = [[OAToken alloc] initWithHTTPResponseBody:httpBody]; 

    // FINISHED! 
} 

- (void)didFailOAuth:(OAServiceTicket*)ticket error:(NSError*)error { 
    // ERROR! 
} 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
#pragma mark UIWebViewDelegate 

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 
    if ([[[request URL] scheme] isEqualToString:@"twitter"]) { 

     // Extract oauth_verifier from URL query 
     NSString* verifier = nil;  
     NSArray* urlParams = [[[request URL] query] componentsSeparatedByString:@"&"]; 
     for (NSString* param in urlParams) { 
      NSArray* keyValue = [param componentsSeparatedByString:@"="]; 
      NSString* key = [keyValue objectAtIndex:0]; 
      if ([key isEqualToString:@"oauth_verifier"]) { 
       verifier = [keyValue objectAtIndex:1]; 
       break; 
      } 
     } 

     if (verifier) { 
      NSURL* accessTokenUrl = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; 
      OAMutableURLRequest* accessTokenRequest = [[[OAMutableURLRequest alloc] initWithURL:accessTokenUrl 
                         consumer:consumer 
                          token:requestToken 
                          realm:nil 
                       signatureProvider:nil] autorelease]; 
      OARequestParameter* verifierParam = [[[OARequestParameter alloc] initWithName:@"oauth_verifier" value:verifier] autorelease]; 
      [accessTokenRequest setHTTPMethod:@"POST"]; 
      [accessTokenRequest setParameters:[NSArray arrayWithObject:verifierParam]]; 
      OADataFetcher* dataFetcher = [[[OADataFetcher alloc] init] autorelease]; 
      [dataFetcher fetchDataWithRequest:accessTokenRequest 
            delegate:self 
          didFinishSelector:@selector(didReceiveAccessToken:data:) 
           didFailSelector:@selector(didFailOAuth:error:)]; 
     } else { 
      // ERROR! 
     } 

     [webView removeFromSuperview]; 

     return NO; 
    } 
    return YES; 
} 

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error { 
    // ERROR! 
} 

@end 
+0

Génial, merci pour cela! J'ai actuellement une situation en cours d'exécution où il lit un code PIN sur le site Web après que l'utilisateur a entré ses informations de connexion, et obtient le jeton oauth en utilisant cela. Je vais essayer votre code et voir si cela fonctionne un peu mieux! Je posterai ce que j'utilise plus tard aussi. :) – Dan

+0

Il s'agissait d'une solution générique pour de nombreux appels de plate-forme pris en charge par oAuth. Merci Andrew – fyasar