0

我們有一個彈簧的web應用程序與春天mvc控制器。它應該連接到我們的Facebook應用程序以獲取用於進一步訪問的身份驗證令牌。與我們的應用程序的通信似乎工作。當我打的鏈接針對Facebook的客戶端身份驗證

<a href="https://www.facebook.com/dialog/oauth?client_id=something&redirect_uri=http://our.domaine.register/postback?user_id=12345&scope=manage_pages&response_type=code">connect</a> 

將我重定向至Facebook,我將輸入我的憑據和重定向回

our.domaine.register/postback?user_id=12345&code=SoMEcOde 

這又是我們的Spring MVC控制器之一,但是那並不是」噸真的事情,因爲

的問題是,被Facebook返回的代碼是一個畸形的accessToken

MEA寧如果我嘗試使用它來訪問受保護的資源,它將無法正常工作。使用通過圖形API瀏覽器檢索的訪問令牌替換相同的調用,它可以正常工作。

返回的代碼有一個特殊的格式,其中有' - ','_'和'='字符,它是普通訪問令牌從不具有的。

所以我假設必須做某種轉換?!或者它是某種形式問題?

返回的標記:

AQBoXkcR5zRUiuHoO_lLdQfnxxxxxxxxxxxxxxxxoPPvZQTeybT9ebsI2SD1Xk

代碼是一樣的accessToken?

官方文檔大多隻是談論使用錨散列(REDIRECT_URL /#access_token = ...)和通過javascript訪問access_token,但我不知道爲什麼我想這樣做,這不是自然的,不是可測試...

有沒有人使用代碼參數將其映射爲請求參數,以便可以在控制器中訪問它?

回答

1

他們返回給您的代碼是OAuth授權碼,沒有訪問令牌。你必須用另一個電話交換那個訪問令牌。見點4在Facebook的 documentation for server-side authentication

UPDATE: (對不起,錯過了標題,在那裏你說 「客戶端身份驗證」;))

使用 response_type=token而不是 response_type=code,讓您第一時間獲得訪問令牌作爲回報而不是OAuth授權碼。請參閱 部分,在Facebook的documentation for client-side authentication上沒有JS SDK的客戶端身份驗證。

UPDATE:

當你正在試圖建立一個Web應用程序,該server-side authentication flow是使用正確的。這意味着將訪問令牌與另一個調用交換授權碼(重定向用戶後獲得的)。

因此,如果我現在明白了它的正確性,那麼您的問題是如何將訪問令牌從您收到的響應中取出。檢查this example如何使用Spring做這樣的事情。對於你的情況,這將是喜歡獲得授權碼:

@RequestMapping(value = "/postback", params = "code", method = RequestMethod.GET) 
@ResponseBody 
private void accessCode(@RequestParam("code") String code, 
          HttpServletRequest request, 
          HttpServletResponse response) throws Exception { 
     //Now the variable 'code' holds the authorization code 
} 
+0

嘿!你的第一個答案實際上是我在找的東西,我想..請在WareNinjas的回覆中查看我的評論。我會嘗試交換的東西,如果這是複雜的我想我將不得不使用javascript的客戶端流.. – Pete 2012-07-31 18:16:06

+0

現在工作。我拿起代碼,然後讓服務器端調用Facebook來獲取令牌。感謝您的輸入 – Pete 2012-08-01 09:17:03

2

看起來像你的response_type是要求代碼,這就是爲什麼沒有令牌返回。

PLZ檢查https://developers.facebook.com/docs/authentication/

例如爲正確調用的最後一個部分;

https://www.facebook.com/dialog/oauth? 
    client_id=YOUR_APP_ID 
    &redirect_uri=https://www.facebook.com/connect/login_success.html 
    &response_type=token 

當登錄成功時,重定向ur包含access_token和expires_in params追加。 你可以解碼的網址參數來獲得你所需要的。 這裏是Android OAuth example樣本函數(便於對Java適應):

public static Bundle decodeUrl(String s) { 
     Bundle params = new Bundle(); 
     if (s != null) { 
      String array[] = s.split("&"); 
      for (String parameter : array) { 
       String v[] = parameter.split("="); 
       // YG: in case param has no value 
       if (v.length==2){ 
        params.putString(URLDecoder.decode(v[0]), 
           URLDecoder.decode(v[1])); 
       } 
       else { 
        params.putString(URLDecoder.decode(v[0])," "); 
       } 
      } 
     } 
     return params; 
    } 

    /** 
    * Parse a URL query and fragment parameters into a key-value bundle. 
    * 
    * @param url the URL to parse 
    * @return a dictionary bundle of keys and values 
    */ 
    public static Bundle parseUrl(String url) { 

     try { 
      URL u = new URL(url); 
      Bundle b = decodeUrl(u.getQuery()); 
      b.putAll(decodeUrl(u.getRef())); 
      return b; 
     } catch (MalformedURLException e) { 
      Log.w(TAG, "parseUrl ex ->" + e.toString()); 
      return new Bundle(); 
     } 
    } 
+0

是的,我知道如果我用類型標記請求它,我直接得到它。但我不知道如何從我的控制器中的錨點散列#access_token中提取令牌。據我所知,我需要使用Javascript來做到這一點,我真的想避免這種情況。所以我想,因爲代碼作爲請求參數返回,我會去...我發現我應該使用服務器端身份驗證來交換令牌代碼.. – Pete 2012-07-31 18:15:02

+0

您可以解析login_success響應url,它包含access_token和expires_in作爲參數。我將附上示例代碼給我的prev答案 – guleryuz 2012-08-01 02:45:06