[英]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.