Facebook PHP SDK - 捕捉用户未授权的情况(认证失败)

5
文档说明: “redirect_uri - (可选)登录/授权过程完成后将用户重定向到的URL。 用户将在登录成功和失败时重定向到该URL,因此您必须像身份验证文档中描述的那样检查URL中的错误参数。 如果未指定此属性,则用户将重定向到当前URL(即调用此方法的页面的URL,通常是用户浏览器中的当前URL)。” 因此,有一种方法可以捕获用户拒绝进行身份验证/权限的情况,但是链接到相应的文档不再存在( https://developers.facebook.com/docs/authentication/ )。
为简单起见,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);
}

有人知道如何捕获这个信息吗?
3个回答

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")) );
}

看起来现在只有这个选项可用...奇怪,我敢打赌,肯定有其他方法可以做到的 ;) - Marcin Bobowski

0

需要注意的是,在最新的PHP Facebook SDK中,没有方法 ->api。使用此检查(有时)获取权限也存在问题。当使用旧版SDK时,有时(似乎是随机用户)一些用户即使在FB访问令牌调试器上显示正确的权限,仍会出现“OAuthException:(#412) User has not installed the application”的情况。更新到新的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还是Google OAuth2中)。

解决方案比预期的要简单得多。

如果完全未接受权限,则在URL中至少会带有一个参数/变量:错误。

在Facebook中,该响应如下:

error=access_denied&error_code=200&error_description=Permissions+error&error_reason=user_denied

对于Google,您只会得到以下内容:

error=access_denied

但这应该足够了。

我只是检查是否设置了错误,并且如果设置了错误,我将重定向响应到我的登录页面。

我希望它能帮助某些人,因为这一步真的没有记录。

顺便说一下: Facebook API版本:v5 Google API oAuth2版本:2.0(我认为-当涉及查找最新版本时,Google文档真的很混乱)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接