4

我正在编写一个 Web 应用程序,并且刚刚实现了用户可以使用 spring-social-(core/twitter) 通过 Twitter 登录。

然而,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);
    }
}
4

1 回答 1

3

我找到了解决方案!这里也有详细说明:简单的 Twitter Oauth 授权,每次都要求提供凭据

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

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

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

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

于 2012-06-05T13:59:35.673 回答