【问题标题】:OAuthConsumer and TwitpicOAuthConsumer 和 Twitpic
【发布时间】:2011-08-19 03:38:18
【问题描述】:

我正在尝试使用 OAuthConsumer 将图像发布到 TwitPic。我不断收到 401“无法验证您的身份(标题被 twitter 拒绝)”。错误。

我还利用 Twitter+OAuth 库来处理登录和发布常规推文,然后保存令牌和令牌密码以与 TwitPic 一起使用。

这是我使用构造请求的代码:

NSURL *twitpicUrl = [NSURL URLWithString:@"http://api.twitpic.com/2/upload.json"];
NSString* realm = @"http://api.twitter.com/";
OAToken* oaToken = [[OAToken alloc] initWithKey:savedToken secret:savedTokenSecret];
OAConsumer* oaConsumer = [[OAConsumer alloc] initWithKey:kOAuthConsumerKey secret:kOAuthConsumerSecret];

OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL:twitpicUrl consumer:oaConsumer
                                    token:oaToken realm:realm signatureProvider:nil] autorelease];
[request prepare];
[request setHTTPMethod:@"POST"];
[request setValue:@"https://api.twitter.com/1/account/verify_credentials.json" forHTTPHeaderField:@"X-Auth-Service-Provider"];

NSString* authorizeHeader = [request valueForHTTPHeaderField:@"Authorization"];
[request setValue:authorizeHeader forHTTPHeaderField:@"X-Verify-Credentials-Authorization"];

如果我打印出我的标题,这就是我得到的(不包括未使用的 Authorization 标题):

    "X-Auth-Service-Provider" = "https://api.twitter.com/1/account/verify_credentials.json";
    "X-Verify-Credentials-Authorization" = "OAuth realm=\"http%3A%2F%2Fapi.twitter.com%2F\", oauth_consumer_key=\"JOvwW7mtZUjRXZRInkQI7w\", oauth_token=\"293217559-pD0HL0oE6TZSkU35mPnc7kia325oPDgMfQMTVArK\", oauth_signature_method=\"HMAC-SHA1\", oauth_signature=\"ctmCK35JFwx8qs8lQj0AYB6sUr4%3D\", oauth_timestamp=\"1304580843\", oauth_nonce=\"7EBE3EB0-641A-40EA-A57C-8D071B5E647F\", oauth_version=\"1.0\"";

我收到的错误是:

Error: The operation couldn’t be completed. (NSURLErrorDomain error -1012.)
{"errors":[{"code":401,"message":"Could not authenticate you (header rejected by twitter)."}]}

我这里排除了一些细节,特别是附加帖子数据,主要是因为我认为它与错误无关。如果您不这么认为,请告诉我,我会更新问题。

谁能帮忙?

更新:这是我现在成功使用的代码

在标题中:

#define kVerifyCredentialsUrl @"https://api.twitter.com/1/account/verify_credentials.json"
#define kTwitPicUrl @"http://api.twitpic.com/2/upload.json"

实施:

//prepare the verify credentials header
NSURL* serviceUrl = [NSURL URLWithString:kVerifyCredentialsUrl];
NSString* realm = @"http://api.twitter.com/";
OAToken* token = [[OAToken alloc] initWithKey:tokenKey secret:tokenSecret];
OAConsumer* consumer = [[OAConsumer alloc] initWithKey:kOAuthConsumerKey secret:kOAuthConsumerSecret];
OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:serviceUrl consumer:consumer token:token realm:realm signatureProvider:nil];
[request setHTTPMethod:@"GET"];
[request prepare];
NSDictionary* headerDictionary = [request allHTTPHeaderFields];
NSString* oAuthHeader = [NSString stringWithString:[headerDictionary valueForKey:@"Authorization"]];
[request release];
request = nil;

//prepare the full request
serviceUrl = [NSURL URLWithString:kTwitPicUrl];
request = [[OAMutableURLRequest alloc] initWithURL:serviceUrl consumer:consumer token:token realm:realm signatureProvider:nil];
[request setHTTPMethod:@"POST"];
[request setValue:kVerifyCredentialsUrl forHTTPHeaderField:@"X-Auth-Service-Provider"];
[request setValue:oAuthHeader forHTTPHeaderField:@"X-Verify-Credentials-Authorization"];

//add the content and start the request
UIImage* imageToUpload = [UIImage imageNamed:@"test.png"];
NSData *data = UIImagePNGRepresentation(imageToUpload);
ASIFormDataRequest *asiRequest = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:kTwitPicUrl]] autorelease];
[asiRequest addRequestHeader:@"X-Auth-Service-Provider" value:kVerifyCredentialsUrl];
[asiRequest addRequestHeader:@"X-Verify-Credentials-Authorization" value:oAuthHeader];
[asiRequest setPostValue:@"Message here" forKey:@"message"];
[asiRequest setPostValue:kTwitPicAPIKey forKey:@"key"];
[asiRequest setData:data forKey:@"media"];
[asiRequest setDidFinishSelector:@selector(requestDone:)];
[asiRequest setDidFailSelector:@selector(requestWentWrong:)];
[asiRequest setDelegate:self];
[asiRequest startAsynchronous];

【问题讨论】:

    标签: iphone objective-c twitter oauth twitpic


    【解决方案1】:

    试试这个:

    NSURL *serviceURL = [NSURL URLWithString:@"https://api.twitter.com/1/account/verify_credentials.json"];
    OAMutableURLRequest *oRequest = [[OAMutableURLRequest alloc] initWithURL:serviceURL
                                                                    consumer:consumer_
                                                                       token:accessToken_
                                                                       realm:@"http://api.twitter.com/"
                                                           signatureProvider:nil];
    [oRequest setHTTPMethod:@"GET"];
    [oRequest prepare];
    NSDictionary * headerDict = [oRequest allHTTPHeaderFields];
    NSString * oauthHeader = [NSString stringWithString:[headerDict valueForKey:@"Authorization"]];
    [oRequest release];
    
    //  Prepare the POST request
    oRequest = nil;
    serviceURL = nil;
    serviceURL = [NSURL URLWithString:@"http://api.twitpic.com/2/upload.json"];
    oRequest = [[OAMutableURLRequest alloc] initWithURL:serviceURL
                                                   consumer:consumer_
                                                      token:accessToken_
                                                      realm:@"http://api.twitter.com/"
                                          signatureProvider:nil];
    [oRequest setHTTPMethod:@"POST"];
    [oRequest setValue:@"https://api.twitter.com/1/account/verify_credentials.json" forHTTPHeaderField:@"X-Auth-Service-Provider"];
    [oRequest setValue:oauthHeader forHTTPHeaderField:@"X-Verify-Credentials-Authorization"];
    

    您还应该在方法末尾的 OAMutableURLRequest.m 中进行此更改 - (void)prepare:

     NSString *oauthHeader = [NSString stringWithFormat:@"OAuth realm=\"%@\", oauth_consumer_key=\"%@\", %@oauth_signature_method=\"%@\", oauth_signature=\"%@\", oauth_timestamp=\"%@\", oauth_nonce=\"%@\", oauth_version=\"1.0\"%@",
                             [realm URLEncodedString],
                             [consumer.key URLEncodedString],
                             oauthToken,
                             [[signatureProvider name] URLEncodedString],
                             [signature URLEncodedString],
                             timestamp,
                             nonce,
                             extraParameters];
    if(![self valueForHTTPHeaderField:@"X-Verify-Credentials-Authorization"])
        [self setValue:oauthHeader forHTTPHeaderField:@"Authorization"];
    

    【讨论】:

    • 将第一个标头的请求设置为 GET 是我的问题。不知道为什么需要这样做,但显然是这样。谢谢!
    【解决方案2】:

    现在也可能是 twitter 的问题。 我的代码像你一样使用 OAMutableURLRequest,多年来一直运行良好,今天我不断收到 401 错误代码。搜索twitter你会发现最近有更多人遇到这个问题。

    这是您现在可以在 api 状态页面中看到的内容:

    我们目前正在经历升高 错误率。可能会有间歇 加载 twitter.com 和 Twitter 的问题 客户。我们意识到了这个问题 并采取行动。谢谢你的 耐心!

    Twitter API Status

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2012-06-08
      • 2010-12-25
      相关资源
      最近更新 更多