【问题标题】:facebook php sdk - catch if user didnt give permissions (authentication failed)facebook php sdk - 如果用户没有授予权限(身份验证失败),则捕获
【发布时间】:2013-01-24 03:17:31
【问题描述】:

文档说: "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);
}

有人知道如何获取这些信息吗?

【问题讨论】:

    标签: php facebook facebook-php-sdk facebook-authentication user-permissions


    【解决方案1】:

    您可以执行以下操作来检查权限:

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

    【讨论】:

    • 看起来这是现在唯一可用的选项...奇怪,我敢打赌,还有其他方法;)
    【解决方案2】:

    需要注意的是,在最新的PHP facebook SDK中,没有方法->api。使用此检查(有时)获取权限似乎也存在问题。使用较旧的 SDK 时,有时(似乎是用户随机)一些用户会收到“OAuthException:(#412)用户尚未安装应用程序”,即使对 FB 访问令牌调试器的检查显示了正确的权限。在我更新到新的 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
    }
    

    【讨论】:

      【解决方案3】:

      我只是遇到了同样的问题,我不知道如何处理取消操作(在 facebook php api 和 google oauth2 中)。

      解决方案比预期的要容易得多。

      在不接受(根本)许可的情况下的响应带有至少一个参数/变量:URL 中的错误。

      在 facebook 中,响应如下所示:

      error=access_denied&error_code=200&error_description=权限+error&error_reason=user_denied

      对于谷歌你只能得到

      error=access_denied

      但应该足够了。

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

      我希望它会对某人有所帮助,因为它确实没有记录这一步。 顺便一提: facebook API 版本:v5 google API oAuth2 的版本:2.0(我认为 - google doc 在查找最新版本时确实是一团糟)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 2019-01-23
        相关资源
        最近更新 更多