Iphone 以与Facebook oauth密钥类似的方式获取Twitter oauth密钥
我有一个iPhone应用程序,当前使用facebook graph api oauth url(.)加载UIWebView-然后用户输入他们的登录详细信息,提交后我从url检索访问令牌。(以我相信的方式)然后将其传递给我的java服务器,该服务器使用RestFB执行各种操作 我的问题是,Twitter是否也有类似的方法?目前,获取数据的唯一方法似乎是下载一个库并使用它;然而,这是一种我不愿意使用的方法,因为它会占用不必要的空间,因为所有命令实际上都是从我的Java服务器上运行的 如有任何建议,将不胜感激 谢谢 DanTwitter使用OAuth 1.0a,但不使用OAuth 2.0 在Twitter上获取访问令牌的步骤:Iphone 以与Facebook oauth密钥类似的方式获取Twitter oauth密钥,iphone,facebook,twitter,Iphone,Facebook,Twitter,我有一个iPhone应用程序,当前使用facebook graph api oauth url(.)加载UIWebView-然后用户输入他们的登录详细信息,提交后我从url检索访问令牌。(以我相信的方式)然后将其传递给我的java服务器,该服务器使用RestFB执行各种操作 我的问题是,Twitter是否也有类似的方法?目前,获取数据的唯一方法似乎是下载一个库并使用它;然而,这是一种我不愿意使用的方法,因为它会占用不必要的空间,因为所有命令实际上都是从我的Java服务器上运行的 如有任何建议,将
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支持的平台调用的通用解决方案。谢谢安德鲁