Jen

簡單的擴充restfb取得access token 流程

(貼心提醒:在閱讀之前,最好先瞭解 facebook graph api 認證與授權的原理喔)

Play framework也有整合了與 facebook graph api溝通的module,名稱叫做 fbgraph,有分 0.1版及0.2版,而這個module主要是整合一個叫做「restfb」的套件,而我在一開始在使用restfb的時候,發現他並沒有把取得access token的流程整合進來,所以這個部分要自行處理,像C# facebook API 就有包含這部分。
而以下是在 Play Framework 使用 fbgraph的流程。

1. Play Install fbgraph-0.2

2.設定application.conf , module.fbgraph=${play.path}/modules/fbgraph-0.2
3.重新產生eclipse的專案(我是用eclipse開發), import project 即可。
API實際用法可以參考 : http://restfb.com/

而如果你看了該網站的示範之後,會發現一開始的範例就直接開始使用access_token,裏面並沒有把「取得access_token」這個部分的流程包到這個module 來,所以自已要額外的去做一些取得 access_token 流程的處理。如果這時你不太清楚facebook graph api 驗證、授權流程,需要先看這裏
所以我就另外擴充了FacebookOauthClient類別,主要是用來處理「取得Access_Token」這一段流程,擴充類別如下圖:





介面:
  • FacebookApplication : 包含了所有appid、secretid、domain等等定義,需要類別實作。
類別:
  • FacebookOauthClient:針對實作FacebookApplication介面的類別實體來與facebook graph api做rest溝通,用來取得login url,code以及 access token。
  • FacebookUtils:一些參數轉換的工作。
而實際用法如下:

1 .定義實作FacebookApplication的類別。
public class DemoFbApp implements FacebookApplication {

 public String getAppId() {
  // TODO Auto-generated method stub
  return "app id";
 }
 public String getAppSecret() {
  // TODO Auto-generated method stub
  return "secret id";
 }
 public String getCancelUrlPath() {
  // TODO Auto-generated method stub
  return null;
 }
 public String getSiteUrl() {
  // TODO Auto-generated method stub
  return "http://localhost/";
 }
}
2.在Controller用取得 facebook login url,並導向。
//自行定義的 demofbapp
protected static FacebookApplication app = new DemoFbApp();
//定義要導回來的url
protected static String RedirectUrl = "http://localhost:1112/HomeController/LogOk";
public static void Oauth()
{
 FacebookOauthClient oauthClient = new FacebookOauthClient(app);
 oauthClient.setReturnUrl(new URI(RedirectUrl));
  
 //可額外定義參數,例如防止CSRF的Status或者授權項目的scope
 //有關 授權項目的 scope 
 //請參考:http://developers.facebook.com/docs/authentication/permissions/ 
 HashMap ppp = new HashMap();
 String url = oauthClient.getLoginUri(ppp).toString();
 redirect(url);
}
將會導向登入畫面。

3.在導回來的url中,取得 code 的參數,再拿這個code 去跟 facebook graph api 要到 access_token。
public static void LogOk(String code){
 FacebookOauthClient oauthClient = new FacebookOauthClient(app);
 oauthClient.setReturnUrl(new URI(RedirectUrl));
 HashMap ppp = new HashMap();
 ppp.put("code", code);
 String accessToken = oauthClient.getAccessToken(ppp);
 //即取得 accessToken 及 Expire ,再自行反序列化成物件即可。
 renderText(accessToken);
}

是的,成功取得Access Token之後,就可以開始使用restfb來使用你想要的功能了,應該算方便又容易使用的架構,enjoy it!

0 意見: