我在使用Google OAuth Java Client调用 twitter REST API 时遇到问题。我能够正确地完成第一步:
- 设置授权网址,
- 获取临时令牌,
- 生成最终令牌。
通过设置 OAuthParameters.token 并将 OAuthParameters 用作 HttpRequestInitializer,使用存储的访问令牌授权对受保护资源的 HTTP 请求。
正是在这一步中,我遇到了问题。首先,如果我只设置 OAuthParameters.token 值,我将得到一个空异常,因为未设置签名者,所以我目前拥有的是:
OAuthHmacSigner signer = new OAuthHmacSigner();
signer.clientSharedSecret=TWITTER_CONSUMER_SECRET;
String oauthToken = req.getParameter("oauth_token");
String oauthVerifier = req.getParameter("oauth_verifier");
OAuthGetAccessToken accessTokenRequest = new OAuthGetAccessToken(TWITTER_ACESS_TOKEN_URL);
accessTokenRequest.consumerKey=TWITTER_CONSUMER_KEY;
accessTokenRequest.signer=signer;
accessTokenRequest.transport=HTTP_TRANSPORT;
accessTokenRequest.temporaryToken=oauthToken;
accessTokenRequest.verifier=oauthVerifier;
OAuthCredentialsResponse credentials = accessTokenRequest.execute();
String token = credentials.token;
OAuthParameters params = new OAuthParameters();
params.token=token;
params.version="1.0";
params.consumerKey=TWITTER_CONSUMER_KEY;
params.signer=signer;
HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory(params);
HttpResponse twResponse = requestFactory.buildGetRequest(new GenericUrl("https://api.twitter.com/1.1/account/verify_credentials.json")).execute();
结果总是:
警告:身份验证错误:无法响应任何这些质询:{} com.google.api.client.http.HttpResponseException: 401 OK {"errors":[{"message":"Could not authenticate you","code ":32}]}
如果我通过 REST Chrome 扩展工具尝试 Twitter OAuth 工具提供的 Authorization 标头,它可以完美运行,因此这不是帐户问题。当我将其更改为由 Google OAuth Java 客户端库计算的 Authorization 标头值时,它不起作用。
我不明白我做错了什么。
解决方案:按照@Arkanon 提供的链接中的教程,我错过了通过以下方式刷新签名者令牌:
signer.tokenSharedSecret