2011-12-12 167 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你已經做到了。