春季安全链和Facebook使用Spring Social

时间:2011-12-12 09:11:15

标签: facebook spring login spring-security spring-social

我必须为一个大型网络项目进行facebook登录,我被困住了。 我们正在使用带有Java 1.6和Spring的Eclipse IDE。此外,我们使用Spring-Security进行验证。 我找到了Spring Social和Spring Social Facebook。 目前登录的出口是: 用户可以输入他的凭据并通过登录按钮登录,或者他按下facebook按钮。之后,他将被重定向到facebookAuthenticationFilter,它会检查他是否按下了facebook按钮。如果他这样做,facebookAuthenticationFilter将生成重定向到Facebook登录。看起来像这样:

FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(APP_ID, APP_SECRET);
OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
OAuth2Parameters params = new OAuth2Parameters();
params.setRedirectUri(REDIRECT_URI);
params.setScope("user_about_me,user_birthday,user_likes,user_status");
String authorizeUrl = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, params);
response.sendRedirect(authorizeUrl);

之后我们寻找“代码”参数,并在收到过滤器后我们做

String authURL = "https://graph.facebook.com/oauth/access_token?client_id="
                    + APP_ID
                    + "&redirect_uri="
                    + REDIRECT_URI
                    + "&client_secret="
                    + APP_SECRET + "&code=" + code;
// Facebook.getAuthURL(code);
URL url = new URL(authURL);
String result = readURL(url);
String authorizationCode = null;
Integer expires = null;
String[] pairs = result.split("&");
for (String pair : pairs) {
    String[] kv = pair.split("=");
    if (kv.length != 2) {
        logger.error("Unexpected auth response");
    } else {
        if (kv[0].equals("access_token")) {
            authorizationCode = kv[1];
        }
        if (kv[0].equals("expires")) {
            expires = Integer.valueOf(kv[1]);
        }
    } // if-else kv.length!=2
} // for

// upon receiving the callback from the provider:
AccessGrant accessGrant = null;
try {
    FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(APP_ID, APP_SECRET);
        OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
    // nächstes produziert einen Fehler: 400 - BAD REQUEST
    accessGrant = oauthOperations.exchangeForAccess(authorizationCode,REDIRECT_URI, null);

    Connection<Facebook> connection = connectionFactory.createConnection(accessGrant);
    Facebook facebook = connection.getApi();

在标记的行上,我们从服务器收到错误请求。不知道为什么。 特别是解析参数“代码”的部分感觉很蹩脚,看起来并不好看。有没有更好的方法呢?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您应该使用传递给回调URL的代码来获取accessGrant,而不是调用authUrl,如下所示:

accessGrant = connectionFactory.getOAuthOperations().exchangeForAccess(code, REDIRECT_URI, null)

使用该accessGrant,你应该可以使你已经建立了连接。