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

有谁知道如何捕捉这些信息?

4

3 回答 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")) );
}
于 2013-02-08T11:23:45.397 回答
0

需要注意的是,在最新的 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
}
于 2015-10-06T23:55:07.497 回答
0

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

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

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

在 facebook 中,响应如下所示:

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

对于谷歌,你只能得到

错误=拒绝访问

但这应该足够了。

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

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

于 2015-12-22T13:13:42.113 回答