所以这就是问题所在,我使用了scribe 3.1.5并且遵循雅虎的文档(显然他们使用的是Oauth1.0),我已经能够获得请求令牌,然后用验证者交换访问令牌。当我尝试使用访问令牌从URL http://social.yahooapis.com/v1/me/guid?format=json获取用户的GUID时,问题就出现了。
现在,有趣的是,雅虎有时会给我回GUID,有时会给我一个“无效签名”错误。有时我连续 5个无效签名,有时我连续 15次成功通话,大部分时间都是 40%无效签名和60成功率。甚至更奇怪的是,有时我在获取GUID时获得了成功,但是当我尝试使用相同的访问令牌和GUID 成功获取用户的配置文件 IMMEDIATELY时,它会给我一个无效的sigature。 (WTF)
所以这是我使用的代码:
重定向用户:
Token requestToken = yahooService.getRequestToken();
getSession().setAttribute("yahooRequestToken", requestToken);
String authenticationUrl = yahooService.getAuthorizationUrl(requestToken);
redirect(authenticationUrl);
获得回调:
@GET @Path("/oauthcallback/yahoo")
public Response yahooCallback(@QueryParam("oauth_token") String oAuthToken, @QueryParam("oauth_verifier") String oAuthVerifier) {
Token requestToken = (Token)getSession().getAttribute("yahooRequestToken");
Token accessToken = yahooService.getAccessToken(requestToken, oAuthVerifier);
UserProfile user = userService.findUserById(getUserId());
try{
//TODO occasioanlly yahoo returns invalid_signature, this is inconsistent and I have no idea why
String guid = yahooService.getGuid(accessToken);
String email = yahooService.getUserEmail(guid, accessToken);
.....
YahooService ::获取访问令牌:
[the service object is protected final OAuthService service; in parent class]
@Override
public Token getAccessToken(Token requestToken, String oAuthVerifier) {
Verifier verifier = new Verifier(oAuthVerifier);
return service.getAccessToken(requestToken, verifier);
}
YahooService ::获取GUID:
@Override
public String getGuid(Token accessToken){
OAuthRequest requestA = new OAuthRequest(Verb.GET, GET_YAHOO);
service.signRequest(accessToken, requestA);
Response responseA = requestA.send();
JsonParser parser = new JsonParser();
//sometimes the response body is a invalid signature error message
JsonObject json = (JsonObject)parser.parse(responseA.getBody());
return json.getAsJsonObject("guid").get("value").getAsString();
}
YahooService ::获取用户电子邮件:
@Override
public String getUserEmail(String guid, Token accessToken) {
String profileCallUrl = GET_YAHOO_PROFILE.replaceAll("GUID", guid);
OAuthRequest requestB = new OAuthRequest(Verb.GET, profileCallUrl);
service.signRequest(accessToken, requestB);
requestB.addHeader("realm", "yahooapis.com");
Response responseB = requestB.send();
JsonParser parser = new JsonParser();
//sometimes the response body is a invalid signature error message
JsonObject jsonProfile = (JsonObject)parser.parse(responseB.getBody());
...processing code, error free
}
我知道在Saged 3.1.5中maven发行版中的YahooAPI类就像2岁,但我怀疑它会导致这种不一致的行为。 Scribe内置支持Google和Live oauth基本没用,不幸的是,不像谷歌或Hotmail这两个都有很棒的文档,所以我基本上可以搞清楚一切,Yahoo的doc停止获取访问令牌,我找不到有用的解释为什么我会使用我的访问令牌获得无效签名SOMETIMES
请帮忙!提前致谢
答案 0 :(得分:0)
它看起来像雅虎问题,我几天都有同样的错误信息:
答案 1 :(得分:0)
由于yahoo在提供访问令牌时返回当前登录用户的GUID,因此无需向yahoo请求GUID,因此如果您有访问令牌,则响应中也有GUID。 Refer this