我一直在尝试进行基本的 OAuth 交互,但没有成功。 SO上肯定已经提出了类似的问题,但大多数都没有答复。我在这里变得非常绝望,所以我将首先发布我的整个代码:

// OAuth parameters
NSString *oauthNonce = [self genRandStringLength:20];
NSString *oauthSignatureMethod = [NSString stringWithFormat:@"HMAC-SHA1"];
time_t oauthTimeStamp = (time_t) [[NSDate date] timeIntervalSince1970];

// generate OAuth signature
NSString *encodedUrlString = [self urlEncode:urlString];

NSString *oauthParameters = [NSString stringWithFormat:@"oauth_consumer_key=%@",oauthConsumerKey];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_nonce=%@",oauthNonce];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_signature_method=%@",oauthSignatureMethod];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_timestamp=%d",oauthTimeStamp];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_token=%@",oauthAccessToken];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_version=1.0"];
NSString *oauthEncodedParameters = [self urlEncode:oauthParameters];

NSString *oauthBaseString = [NSString stringWithFormat:@"GET&%@&%@",encodedUrlString,oauthEncodedParameters];

NSString *oauthKey = [NSString stringWithFormat:@"%@&%@", oauthConsumerSecret, oauthAccessTokenSecret];
NSString *oauthEncodedKey = [self urlEncode:oauthKey];

OAHMAC_SHA1SignatureProvider *provider = [[OAHMAC_SHA1SignatureProvider alloc] init];
NSString *oauthSignature = [provider signClearText:oauthBaseString withSecret:oauthEncodedKey];
NSString *oauthEncodedSignature = [self urlEncode:oauthSignature];

// prepare request
NSString *oauthHeader = @"OAuth ";
oauthHeader = [oauthHeader stringByAppendingFormat:@"oauth_consumer_key=\"%@\"",oauthConsumerKey];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_token=\"%@\"",oauthAccessToken];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature_method=\"%@\"",oauthSignatureMethod];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature=\"%@\"",oauthEncodedSignature];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_timestamp=\"%d\"",oauthTimeStamp];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_nonce=\"%@\"",oauthNonce];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_version=\"1.0\""];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"GET"];
[request setValue:oauthHeader forHTTPHeaderField:@"Authorization"];

NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

当我查看 http 响应代码时,我得到 500。我已就意外的 500 响应与服务提供商联系。

与此同时,我可能做错了什么,对你来说有什么突出之处吗?

即使只是将我指向一些工作示例代码也会受到高度赞赏。我已经阅读了很多东西,但我显然在 obj-c 中发现了一些细微差别。提前致谢。

最佳答案

如果我是你,我会在 ShareKit 上查看 github 的源代码,它与许多 OAuth Web 服务集成。我相信它使用 OAuthConsumer 可能对您特别有用。 OAuthConsumer 有一些文档,您可能想尝试将其集成到您的应用程序中。

如果您查看 OAMutableURLRequest ,您可以看到 OAuthConsumer 如何创建请求。除了它们有一个 realm header 之外,我没有看到您的 header 设置方式有什么大的不同。我的建议是尝试使用 OAuthConsumer 发出请求,看看它是否有效。如果它不适用于 OAuthConsumer,那么我会想象问题出在其他地方(也许在服务器上?)。

关于objective-c - 对受 OAuth 保护的 URL 进行 GET 调用,第 2 部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11093936/

10-10 23:31