2012-06-05 37 views
4

我正在编写一个web应用程序,刚刚实现了用户可以使用spring-social-(core/twitter)通过Twitter登录。通过Twitter登录OAuth不记得授权

但是,Twitter的行为奇怪。在初始身份验证/授权后,每次我将用户发送给Twitter进行身份验证时,Twitter都会提示再次授权我的应用程序。我查看了连接的Twitter个人资料。我的应用程序在那里,并正确授权(在我的情况下阅读访问)。

我没有请求额外权限的情况。我的所有应用程序需求都是读取权限(授权对话框确认这一点)。

我使用OAuth1Operations(由TwitterConnectionFactory返回)执行OAuth舞蹈并将生成的连接保存到数据库中。我的前端是用Wicket 1.5编写的。

我可以通过一次又一次重新授权我的应用程序来解决此问题,当我想通过Twitter登录时,但这是一个很大的麻烦。任何人都知道我在这里错过了什么?

这里是我的代码:

TwitterConnectionFactory connectionFactory = (TwitterConnectionFactory) connectionFactoryLocator.getConnectionFactory(Twitter.class); 
String callbackUrl = [...]; 

if (pageParameters.get("oauth_token").isNull() || pageParameters.get("oauth_verifier").isNull()) { 
    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>(); 
    params.add("x_auth_access_type", "read"); 
    OAuthToken token = connectionFactory.getOAuthOperations().fetchRequestToken(callbackUrl, params); 

    String url = connectionFactory.getOAuthOperations().buildAuthorizeUrl(token.getValue(), OAuth1Parameters.NONE); 

    getSession().setAttribute("twitter_token", token); 
    setResponsePage(new RedirectPage(url)); 
} else { 
    String token = pageParameters.get("oauth_token").toString(); 
    String verifier = pageParameters.get("oauth_verifier").toString(); 

    OAuthToken previousToken = (OAuthToken) getSession().getAttribute("twitter_token"); 

    if (previousToken.getValue().equals(token)) { 
     AuthorizedRequestToken authorizedRequestToken = new AuthorizedRequestToken(previousToken, verifier); 

     OAuthToken accessToken = connectionFactory.getOAuthOperations().exchangeForAccessToken(authorizedRequestToken, null); 
     Connection<Twitter> connection = connectionFactory.createConnection(accessToken); 
    } 
} 

回答

3

我已经找到了解决方案!这里也详述:Simple Twitter Oauth authorization asking for credentials every time

问题是我特别要求Twitter每次授权我的应用程序。更换:

String url = connectionFactory.getOAuthOperations().buildAuthorizeUrl(token.getValue(), OAuth1Parameters.NONE); 

String url = connectionFactory.getOAuthOperations().buildAuthenticateUrl(token.getValue(), OAuth1Parameters.NONE); 

解决的问题! 如果应用程序尚未获得授权,则调用URL进行身份验证只会要求授权。

+0

我得到了同样的问题,但我已经调用'authenticate'而不是'authorize' :( –

+0

@Deejay:你可以发布你的代码吗?也许你遇到过其他问题... – r3nj1

+2

我想它出去了 - Twitter在去年更改了他们的API,所以你必须勾选他们的应用程序设置页面上的一个复选框,以允许OAuth连接用于认证。 –