Iphone 以与Facebook oauth密钥类似的方式获取Twitter oauth密钥

Iphone 以与Facebook oauth密钥类似的方式获取Twitter oauth密钥,iphone,facebook,twitter,Iphone,Facebook,Twitter,我有一个iPhone应用程序,当前使用facebook graph api oauth url(.)加载UIWebView-然后用户输入他们的登录详细信息,提交后我从url检索访问令牌。(以我相信的方式)然后将其传递给我的java服务器,该服务器使用RestFB执行各种操作 我的问题是,Twitter是否也有类似的方法?目前,获取数据的唯一方法似乎是下载一个库并使用它;然而,这是一种我不愿意使用的方法,因为它会占用不必要的空间,因为所有命令实际上都是从我的Java服务器上运行的 如有任何建议,将

我有一个iPhone应用程序,当前使用facebook graph api oauth url(.)加载UIWebView-然后用户输入他们的登录详细信息,提交后我从url检索访问令牌。(以我相信的方式)然后将其传递给我的java服务器,该服务器使用RestFB执行各种操作

我的问题是,Twitter是否也有类似的方法?目前,获取数据的唯一方法似乎是下载一个库并使用它;然而,这是一种我不愿意使用的方法,因为它会占用不必要的空间,因为所有命令实际上都是从我的Java服务器上运行的

如有任何建议,将不胜感激

谢谢

Dan

Twitter使用OAuth 1.0a,但不使用OAuth 2.0

在Twitter上获取访问令牌的步骤:

  • 在Twitter上创建自己的应用程序,并获取消费者密钥和机密
  • 在我的例子中,下载开源OAuth库
  • 编写注册码,参见下面的示例
  • p、 如果将应用程序类型设置为web应用程序,它将启用回调而不是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
    

    太棒了,谢谢你!我目前有一种情况,它在用户输入登录详细信息后从网站读取PIN码,并使用该PIN码获取oauth令牌。我会试试你的代码,看看效果是否更好!稍后我还会发布我正在使用的内容。:)它是许多oAuth支持的平台调用的通用解决方案。谢谢安德鲁