我正在使用iOS兼容版本的OAuthConsumer库,并尝试对Splitwise的API进行身份验证。获取requestToken和verifier后,我请求一个accessToken,如下所示:
- (void)getAuthorizedAccessToken:(NSString *)pin {
NSURL *url = [NSURL URLWithString:@"https://secure.splitwise.com/api/v3.0/get_access_token"];
OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
consumer:self.consumer
token:self.accessToken
realm:nil
signatureProvider:nil];
OARequestParameter *token = [[OARequestParameter alloc] initWithName:@"oauth_token" value:self.accessToken.key];
OARequestParameter *verifier = [[OARequestParameter alloc] initWithName:@"oauth_secret" value:pin];
[request setParameters:@[token, verifier]];
[request setHTTPMethod:@"POST"];
OADataFetcher *fetcher = [[OADataFetcher alloc] init];
[fetcher fetchDataWithRequest:request
delegate:self
didFinishSelector:@selector(accessTokenTicket:didFinishWithData:)
didFailSelector:@selector(accessTokenTicket:didFailWithError:)];
NSLog(@"Sent access-token OAuth request");
}
但是当我的didFinishWithData函数被返回时,我输出的所有内容都是错误的:"无效的OAuth请求",当我希望它成功时。
- (void)accessTokenTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data {
NSLog(@"accessTokenTicket didFinishWithData");
if (ticket.didSucceed) {
NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
self.accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];
[self.accessToken storeInUserDefaultsWithServiceProviderName:@"WhoPays" prefix:@"WP"];
[self testAPIConnection];
} else {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
}
我已经将我的代码与Twitter的这个工作版本进行了比较,我认为我的逻辑似乎是有序的: https://code.google.com/p/oauthconsumer-iphone/source/browse/trunk/examples/oauthTwitterApp/Classes/oauthTwitterAppViewController.m
我的整个代码可以在这里找到: https://github.com/crummy/whopays/blob/master/WhoPays%3F/WPWelcomeViewController.m
答案 0 :(得分:1)
Hey Crummy - 来自Splitwise的Ryan。我本周即将离开办公室,所以我没有机会自己测试,但我可以看到你的代码中至少有一个错误:你正在初始化OARequestParameter *verifier
名称错误("oauth_secret"
而不是"oauth_verifier"
)。
此外,您可能需要调整代码,以便oauth_token
和oauth_verifier
作为"授权"的一部分传递。 HTTP标头,而不是POST参数。我们的服务器端OAuth实现有点挑剔,我不确定它是否允许标头之外的那些值。如果你按照我们的docs来写信,那么一切都应该正常。
希望有所帮助!如果您仍然遇到问题,请在此处或发送电子邮件至developers@splitwise.com告知我们,我们将在周一与您联系:)
编辑:以防有人稍后遇到这篇文章,事实证明问题是(1)修复上面列出的参数名称和(2)确保请求是通过POST完成的,而不是GET。