繁体   English   中英

Yahoo Oauth不一致的“无效签名”

[英]Yahoo Oauth inconsistent “Invalid Signature”

H!我现在与Yahoo Oauth的处境非常艰难。

所以这就是问题所在,我使用的是抄写员3.1.5,并遵循Yahoo的文档(显然他们使用的是Oauth1.0),我已经能够获取请求令牌,然后使用验证程序交易访问令牌。 当我尝试使用访问令牌从URL http://social.yahooapis.com/v1/me/guid?format=json获取用户的GUID时,就会出现问题。

现在,有趣的是,雅虎有时会给我GUID,有时还会给我“无效签名”错误。 有时我连续获得5个无效签名 ,有时我连续获得15个成功调用 ,大多数情况下,这就像40%无效签名和60%成功 甚至更奇怪的是,有时我在获取GUID时获得成功,但是当我尝试在成功之后使用相同的访问令牌和GUID 立即获取用户的个人资料时,它给了我一个无效的签名...(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

}

我知道在Maven发行版中的Scribe 3.1.5中的YahooAPI类大约2岁了,但是我怀疑这会导致这种不一致的行为。 Scribe内置的对Google和Live oauth的支持基本上是无用的,不幸的是,与Google或Hotmail都不一样,它们都有很棒的文档,所以我基本上可以自己弄清楚一切,Yahoo的文档停止获取访问令牌,我找不到关于它的有用解释。为什么有时我的访问令牌会收到无效的签名

请帮忙! 提前致谢

无需向Yahoo请求GUID,因为yahoo在为您提供访问令牌时会返回当前登录用户的GUID,因此,如果您具有访问令牌,则响应中还将包含GUID。 推荐这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM