5

文檔說: 「redirect_uri - (可選)一旦登錄/授權過程完成,用戶將重定向到的URL。用戶將被重定向到在登錄成功和失敗的URL上,所以你必須按照認證文檔中的描述檢查URL中的錯誤參數,如果沒有指定這個屬性,用戶將被重定向到當前URL(即這個頁面的URL方法被調用,通常是用戶瀏覽器中的當前URL)。「 因此,有一種方法可以捕獲用戶是否拒絕了自動驗證/權限,但鏈接到相應的文檔不存在了(https://developers.facebook.com/docs/authentication/)。facebook php sdk - 如果用戶未授予權限(認證失敗),則捕獲

爲了簡單起見,REDIRECT_URI是相同的地址作爲起始PHP文件,PHP代碼很簡單,只要:

require 'facebook.php'; 
$facebook = new Facebook(array(
    'appId' => 'X', 
    'secret' => 'Y', 
)); 
$user = $facebook->getUser(); 
if ($user) { 
    try { 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    $user = null; 
    } 
} 
if (!$user) { 
    $params = array(
    'scope' => 'read_stream, friends_likes', 
    'redirect_uri' => 'http://myapp.com/app' 
); 
    $loginUrl = $facebook->getLoginUrl($params); 
} 

任何人知道如何捕捉到這些信息?

回答

11

你可以做以下檢查權限:

$permissions = $facebook->api("/me/permissions"); 
if(array_key_exists('publish_stream', $permissions['data'][0])) { 
    // Permission is granted! 
    // Do the related task 
    $post_id = $facebook->api('/me/feed', 'post', array('message'=>'Hello World!')); 
} else { 
    // We don't have the permission 
    // Alert the user or ask for the permission! 
    header("Location: " . $facebook->getLoginUrl(array("scope" => "publish_stream"))); 
} 
+0

它看起來就像是唯一的選擇現在可用......奇怪的是,我敢打賭,有辦法以其他方式做到這一點;) –

0

應該指出的是,在最新的PHP SDK的Facebook,有沒有一種方法 - > API。使用此檢查(有時)也會出現問題以獲取權限。在使用較舊的SDK時,有時(似乎是隨機的用戶),即使對FB訪問令牌調試程序的檢查顯示適當的權限,某些用戶正在收到「OAuthException:(#412)用戶尚未安裝該應用程序」。在我更新到新的SDK後,找出獲取簡單的權限數據列表的新方法後,所有工作都重新開始。

我花了很多時間在FB網站上尋找這個解決方案,所以我把它粘貼在這裏,希望能夠幫助別人節省幾個小時。他們真正的生活拯救者是我發現了getDecodedBody方法(在FB文檔中很難找到訣竅)。我的例子只是檢查publish_actions。

$fb = new Facebook\Facebook([ 
    'app_id' => your_app_id, 
    'app_secret' => your_secret, 
    'default_graph_version' => 'v2.2', 
]); 

$badperms=true; //start by assume bad permissions 

try { 
    $response = $fb->get('/me/permissions', $at); 
    $perms = $response->getDecodedBody(); 

    if($badperms){ 
     foreach($perms['data'] AS $perm){ 
      if($perm['permission']=='publish_actions' && $perm['status']=='granted') $badperms=false; 
     } 
    } 

} catch(Facebook\Exceptions\FacebookResponseException $e) { 
    log("MSG-received facebook Response exception!! ".$e->getMessage()); 
} catch(Facebook\Exceptions\FacebookSDKException $e) { 
    log("MSG-received facebook SDK exception!! ".$e->getMessage()); 
} 

if($badperms) { 
    //do something like reflow auth 
} 
0

我剛剛有同樣的問題,我不知道如何對待取消操作(在facebook php api和谷歌oauth2)。

該解決方案比預期的要容易得多。

如果權限未被接受(根本不接受),響應至少包含一個參數/變量:URL中的錯誤。

在Facebook的這種反應是這樣的:

錯誤= ACCESS_DENIED & ERROR_CODE = 200 & ERROR_DESCRIPTION =權限+錯誤& ERROR_REASON = user_denied

爲谷歌,你只能得到

error = access_denied

但它應該足夠了。

我只是檢查是否設置了錯誤,如果設置了,我將響應重定向到我的登錄頁面。

我希望它能幫助別人,因爲這一步沒有記錄。 順便說一句: 版本的Facebook API的:V5 版本的谷歌API的oauth2的:2.0(我認爲 - 谷歌文檔確實是一個爛攤子,當談到找到最新版本)