【问题标题】:Splitwise API returns "Invalid OAuth Request" after requesting accessToken请求 accessToken 后,Splitwise API 返回“无效的 OAuth 请求”
【发布时间】:2014-06-11 23:18:50
【问题描述】:

我正在使用与 iOS 兼容的 OAuthConsumer 库版本,并尝试针对 Splitwise 的 API 进行身份验证。获取 requestToken 和验证者后,我请求一个 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

【问题讨论】:

    标签: ios oauth


    【解决方案1】:

    Hey Crummy – 来自 Splitwise 的 Ryan。我周末正要离开办公室,所以我没有机会亲自测试,但我可以在您的代码中看到至少一个错误:您正在初始化 OARequestParameter *verifier 错误名称("oauth_secret" 而不是 "oauth_verifier")。

    另外,您可能需要调整代码,以便将oauth_tokenoauth_verifier 作为“授权”HTTP 标头的一部分而不是作为 POST 参数传递。我们的服务器端 OAuth 实现有点挑剔,我不确定它是否允许标头之外的这些值。如果您信守我们的docs,一切都应该正常。

    希望对您有所帮助!如果您仍有问题,请在此处或通过 developers@splitwise.com 告知我们,我们将在周一回复您:)

    编辑:以防万一有人稍后看到这篇文章,事实证明问题是 (1) 修复上述参数名称和 (2) 确保请求是通过 POST 发出的,而不是 GET。

    【讨论】:

    • 太棒了 - 我对所有的令牌、秘密、密钥和验证程序感到困惑。我已经更新了 github 存储库,但是当我在这里点击测试 API 时,我现在得到了一个 404 页面:github.com/crummy/whopays/blob/master/WhoPays%3F/…
    • 看起来testAPIConnection 实际上根本没有被调用——get_access_token 阶段仍然失败。 (在accessTokenTicket:didFinishWithData 中,ticket.didSucceed 等于NO,所以testAPIConnection 永远不会触发。)您是否尝试过将oauth_tokenoauth_verifier 参数移动到HTTP 标头,就像我上面提到的那样?就像我说的,不确定我们的服务器是否接受它们作为 POST 参数——如果没有,我可以将其添加到我们的错误列表中,但可能需要一些时间来修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2013-11-16
    • 2020-06-14
    • 2019-10-02
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多