2016-07-07 106 views
1

我正在構建一個寧靜的API(PHP)來爲iOS和Android應用程序提供服務,並且我想在這兩個應用程序上實現Facebook登錄。Restful API - 檢查Facebook訪問令牌是否有效並被授權使用APP

的缺陷是這樣的:

  • 客戶端(IOS或Android)登錄與facebook和發送的access_token到寧靜API
  • 驗證,如果的access_token被授權使用所述應用
  • 如果令牌有效,從圖中獲取用戶數據。
  • 合併帳戶併爲不同的查詢生成令牌。

爲了安全起見,爲了避免獲得它們不屬於我的APP的隨機令牌,我想做一個測試調用來檢查令牌是否被授權和有效?

我知道許多類似的問題可能已經得到解答,但他們都沒有真正給我正確的答案,我也沒有真正的facebook臉譜經驗。

我發現這個解決方案:

https://graph.facebook.com/oauth/access_token?client_id=APP_ID&client_secret=SECRET_APP_ID&grant_type=fb_exchange_token&fb_exchange_token=ACCESS_TOKEN 

此作品不知爲什麼...它是否給我一個錯誤,或訪問令牌(字符串格式不JSON),我不知道這是最好的辦法測試與否。

注意:我還處於發展初期,如果您對我的流量有任何建議,請告訴我,我可能會以錯誤的方式做事嗎?

+1

無論如何,「隨機」標記都不起作用。只需使用您獲取的訪問令牌來請求用戶詳細信息 - 如果因爲有人試圖「僞造」它而無效,那麼API響應會告訴您。 //該文檔有關於保護API請求的章節,請查看以下內容:https://developers.facebook.com/docs/graph-api/securing-requests/ – CBroe

+0

輝煌!現在我爲我的服務器調用添加了appsecret_proof,它完美地工作,我不認爲隨機標記可以繼續工作:D您可以添加您的評論作爲答案,以便我可以接受它嗎?謝謝 :) –

回答

1

「隨機」標記無論如何都不起作用。 (由Facebook發佈的令牌是加密的,所以API可以告訴令牌是真的,還是隻是「隨機」的。至多你需要擔心用戶可能會使用不同的應用令牌,或者一個令牌他們自己授予的權限超過您要求的權限。)

只需使用您獲取的訪問令牌請求用戶詳細信息 - 如果因爲有人試圖「僞造」它而無效,那麼API響應會告訴您。

的文檔有一個有關保護API請求章,去檢查了這一點,以及:https://developers.facebook.com/docs/graph-api/securing-requests

3

我的應用程序(代碼如下解釋)什麼工作......

$fb = new Facebook\Facebook([ 
'app_id' => 'XXXXXXX', 
    'app_secret' => 'XXXXXXX', 
    'default_graph_version' => 'v2.5', 
]); 

// My app pulls users' access tokens & page ID from a database here and stores in $fb_access_token & $fb_page_id variables 
$fb_access_token = 'YOU OR YOUR USERS ACCESS TOKEN GOES HERE'; 
$fb_page_id = 'ID OF FACEBOOK PAGE OR USER'; 

$fb->setDefaultAccessToken($fb_access_token); 

// CHECK IF ACCESS TOKEN SITLL WORKS 
try{ 
$page = $fb->get('/'.$fb_page_id.'?fields=id', $fb_access_token); 
} catch(Facebook\Exceptions\FacebookResponseException $e) { 
echo 'Graph returned an error: ' . $e->getMessage(); 
$graphError = 'Yes'; 
} catch(Facebook\Exceptions\FacebookSDKException $e) { 
echo 'Facebook SDK returned an error: ' . $e->getMessage(); 
$sdkError = 'Yes'; 
} 

// IF ACCESS TOKEN STILL WORKS...CONTINUE WITH SCRIPT. THIS PREVENTS ACCESS TOKEN FAILURE FROM BREAKING SCRIPT. 
if(!isset($graphError) && !isset($sdkError)){ 
// CONTINUE WITH SCRIPT 
} 

解釋:正在考慮訪問令牌,並試圖向Facebook API發出GET請求。如果沒有錯誤,請繼續執行腳本的其餘部分。

您還可以在最後添加ELSE語句,以便將用戶重定向到可以重新驗證其帳戶/訪問令牌的頁面,具體取決於您的應用正在執行的操作。

我的應用程序使用一對夫婦而循環都要經過我的用戶數據庫,並根據特定列/單元格的值,它的帖子到他們的Facebook頁面,他們...

此解決方案之前...當Loop遇到一個無效的訪問令牌時,它會「破壞」,並且沒有爲「未經身份驗證的用戶」之後的行執行腳本,因爲它發出失敗的請求。

希望這可以幫助別人!

相關問題