2011-12-12 155 views
0

我必须做一个大型网站项目的Facebook登录,我卡住了。 我们使用Eclipse IDE和Java 1.6和Spring。此外,我们使用Spring-Security进行验证。 我发现春季社交和它与春天社交Facebook。 登录的当前插座是: 用户可以输入他的凭证并通过登录按钮登录,或者他按下facebook按钮。之后,他将被重定向到facebookAuthenticationFilter,它会检查他是否按下facebook按钮。如果他这样做,FacebookAuthenticationFilter将生成重定向到Facebook登录。这看起来是这样的:春季安全链和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(); 

在标记线之后,我们得到来自服务器的错误的请求。不知道为什么。 特别是解析参数“代码”的部分会感到恶心并且看起来不太好。没有更好的方法来做到这一点吗?

感谢您的帮助提前。

+0

注意authorizationCode,这可能包括clientId! –

回答

1

而不是调用authUrl的,你应该使用传递给回调URL代码即可获得一个accessGrant,像这样:

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

有了这accessGrant你应该能够建立连接ILKE你已经做到了。