Yahoo Oauth不一致“无效签名”

时间:2013-11-25 19:31:28

标签: java oauth yahoo-api scribe yahoo-oauth

H!我现在正在与Yahoo Oauth度过非常艰难的时光。

所以这就是问题所在,我使用了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

请帮忙!提前致谢

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

由于yahoo在提供访问令牌时返回当前登录用户的GUID,因此无需向yahoo请求GUID,因此如果您有访问令牌,则响应中也有GUID。 Refer this