图表返回了错误:请确保您的redirect_uri与您在OAuth对话框请求

时间:2017-07-14 13:42:37

标签: php facebook codeigniter oauth sdk

我尝试使用带有codeigniter的facebook PHP-SDK为我的网站实现facebook登录,方法如下:https://shareurcodes.com/blog/facebook%20php%20sdk%20v5%20with%20codeigniter

从我在其他问题上看到的这个问题,我检查了给定的答案/常见错误,但http://localhost/fbcallback已经在我的应用程序的有效OAuth重定向URI和推送/删除' / '从网址的末尾没有帮助。

我在第一个创建了两个控制器:fblogin.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');
  class Fblogin extends CI_Controller{


   public function index(){

    require_once '{path}/Facebook/autoload.php';

    $fb = new Facebook\Facebook([
          'app_id' => '{app-id}',
          'app_secret' => '{app-secret}',
          'default_graph_version' => 'v2.5',

        ]);
    $helper = $fb->getRedirectLoginHelper();

    $permissions = ['email','user_location','user_birthday','publish_actions'];
 // For more permissions like user location etc you need to send your application for review
    $loginUrl = $helper->getLoginUrl('http://localhost/fbcallback', $permissions);
    header("location: ".$loginUrl);
 }
}

第二个:fbcallback.php

<?php defined('BASEPATH') OR exit('No direct script access allowed');
  class Fbcallback extends CI_Controller{
    public function index(){

     require_once '{path}/Facebook/autoload.php';

     $fb = new Facebook\Facebook([
     'app_id' => '{app-id}',
     'app_secret' => '{app-secret}',
     'default_graph_version' => 'v2.5',
     ]);
     $helper = $fb->getRedirectLoginHelper();

     if (isset($_GET['state'])) {
        $helper->getPersistentDataHandler()->set('state', $_GET['state']);
      }

     try {
         $accessToken = $helper->getAccessToken();
     } catch(Facebook\Exceptions\FacebookResponseException $e) {
     // When Graph returns an error
        echo 'Graph returned an error: ' . $e->getMessage();
        exit;
     } catch(Facebook\Exceptions\FacebookSDKException $e) {
      // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
       }


     try {
       // Get the Facebook\GraphNodes\GraphUser object for the current user.
       // If you provided a 'default_access_token', the '{access-token}' is optional.
       $response = $fb->get('/me?fields=id,name,email,first_name,last_name,birthday,location,gender', $accessToken);
       // print_r($response);
      } catch(Facebook\Exceptions\FacebookResponseException $e) {
      // When Graph returns an error
        echo 'ERROR: Graph ' . $e->getMessage();
        exit;
      } catch(Facebook\Exceptions\FacebookSDKException $e) {
          // When validation fails or other local issues
        echo 'ERROR: validation fails ' . $e->getMessage();
        exit;
        }

            // User Information Retrieval begins................................................
        $me = $response->getGraphUser();

        $location = $me->getProperty('location');
        echo "Full Name: ".$me->getProperty('name')."<br>";
        echo "First Name: ".$me->getProperty('first_name')."<br>";
        echo "Last Name: ".$me->getProperty('last_name')."<br>";
        echo "Gender: ".$me->getProperty('gender')."<br>";
        echo "Email: ".$me->getProperty('email')."<br>";
        echo "location: ".$location['name']."<br>";
        echo "Birthday: ".$me->getProperty('birthday')->format('d/m/Y')."<br>";
        echo "Facebook ID: <a href='https://www.facebook.com/".$me->getProperty('id')."' target='_blank'>".$me->getProperty('id')."</a>"."<br>";
        $profileid = $me->getProperty('id');
        echo "</br><img src='//graph.facebook.com/$profileid/picture?type=large'> ";
        echo "</br></br>Access Token : </br>".$accessToken;

   }
  }

当我转到http://localhost/fblogin时,它会询问必要的权限(电子邮件,用户位置,用户生日,发布操作),但在我提供权限并重定向到http://localhost/fbcallback后,我收到以下错误:< br />

  

图表返回错误:验证验证码时出错。请确保您的redirect_uri与您在OAuth对话框请求中使用的redirect_uri相同。

当我在玩的时候,我意识到我是否更改了$loginUrl变量 vendor / facebook / graph-sdk / src / Facebook / Authentication / OAuth2Client.php到http://localhost/fbcallback,如下所示,一切按预期工作。所以我怀疑在传递$ loginUrl参数时可能存在问题,并且跟踪了我的代码但是找不到任何问题。

public function getAuthorizationUrl($loginUrl, $state, array $scope = [], array $params = [], $separator = '&')
{
    $params += [
        'client_id' => $this->app->getId(),
        'state' => $state,
        'response_type' => 'code',
        'sdk' => 'php-sdk-' . Facebook::VERSION,
        'redirect_uri' => 'http://localhost/fbcallback', //instead of {$redirectUrl}
        'scope' => implode(',', $scope)
    ];
  

让我感到困惑的是,如果我更改服务器的DocumentRoot并使用facebook-sdk库复制上述两个控制器,那么在新目录中一切正常。那么也许与当前目录中的一个文件存在冲突?我搜索了它但却找不到任何可能发生冲突的东西。

提前致谢!

1 个答案:

答案 0 :(得分:0)

getAccessToken的{​​{1}}方法会生成API请求网址,以交换包含FacebookRedirectLoginHelper参数的令牌代码。

如果在调用方法时未明确指定此参数,则会在内部确定并回退到当前脚本URL /路由。

因此,只要您处理生成登录URL并在同一路径resp下处理生成的代码参数,这样就可以在不指定重定向URI的情况下工作。在相同的脚本URL下;但如果这两者不同,那么你需要在调用redirect_uri时指定它。