无法在 Laravel 4 中使用 Facebook 的 PHP SDK 获取用户个人资料
Posted
技术标签:
【中文标题】无法在 Laravel 4 中使用 Facebook 的 PHP SDK 获取用户个人资料【英文标题】:Cannot get user profile using Facebook's PHP SDK in Laravel 4 【发布时间】:2014-08-09 05:20:21 【问题描述】:我是一个使用 Facebook 的新 php 4 SDK 的应用程序。我正在尝试使用 Facebook 登录。我正在使用 Laravel 4。但似乎有问题,我无法弄清楚。
这是我的控制器代码。
<?php
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookAuthorizationException;
use Facebook\GraphObject;
class FacebookController extends BaseController
public function __construct()
session_start();
FacebookSession::setDefaultApplication('xxx','yyy');
//when the user clicks on the login button he comes to this function
public function getLogin()
$helper = new FacebookRedirectLoginHelper(url('facebook/user'));
return Redirect::to($helper->getLoginUrl());
//when the user logs in, he comes to this function
public function getUser()
try
$session = new FacebookSession(Session::get('_token'));
$request = new FacebookRequest($session, 'GET', '/me');
$response = $request->execute();
$graphObject = $response->getGraphObject()->asArray();
dd($graphObject);
catch(Exception $e)
dd($e);
这是我遇到的错误。
object(Facebook\FacebookAuthorizationException)#160 (10)
["statusCode":"Facebook\FacebookRequestException":private]=>
int(400)
["rawResponse":"Facebook\FacebookRequestException":private]=>
string(86) ""error":"message":"Invalid OAuth access token.","type":"OAuthException","code":190"
["responseData":"Facebook\FacebookRequestException":private]=>
array(1)
["error"]=>
array(3)
["message"]=>
string(27) "Invalid OAuth access token."
["type"]=>
string(14) "OAuthException"
["code"]=>
int(190)
["message":protected]=>
string(27) "Invalid OAuth access token."
["string":"Exception":private]=>
string(0) ""
["code":protected]=>
int(190)
["file":protected]=>
string(77) "/app/www/vendor/facebook/php-sdk-v4/src/Facebook/FacebookRequestException.php"
["line":protected]=>
int(104)
["trace":"Exception":private]=>
array(19)
[0]=>
array(6)
["file"]=>
string(68) "/app/www/vendor/facebook/php-sdk-v4/src/Facebook/FacebookRequest.php"
["line"]=>
int(268)
["function"]=>
string(6) "create"
["class"]=>
string(33) "Facebook\FacebookRequestException"
["type"]=>
string(2) "::"
["args"]=>
array(3)
[0]=>
string(86) ""error":"message":"Invalid OAuth access token.","type":"OAuthException","code":190"
[1]=>
object(stdClass)#159 (3)
["message"]=>
string(27) "Invalid OAuth access token."
["type"]=>
string(14) "OAuthException"
["code"]=>
int(190)
[2]=>
int(400)
[1]=>
array(6)
["file"]=>
string(47) "/app/www/app/controllers/FacebookController.php"
["line"]=>
int(26)
["function"]=>
string(7) "execute"
["class"]=>
string(24) "Facebook\FacebookRequest"
["type"]=>
string(2) "->"
["args"]=>
array(0)
[2]=>
array(4)
["function"]=>
string(7) "getUser"
["class"]=>
string(18) "FacebookController"
["type"]=>
string(2) "->"
["args"]=>
array(0)
[3]=>
array(4)
["file"]=>
string(71) "/app/www/vendor/laravel/framework/src/Illuminate/Routing/Controller.php"
["line"]=>
int(231)
["function"]=>
string(20) "call_user_func_array"
["args"]=>
array(2)
[0]=>
&array(2)
[0]=>
object(FacebookController)#128 (3)
["beforeFilters":protected]=>
array(0)
["afterFilters":protected]=>
array(0)
["layout":protected]=>
NULL
[1]=>
string(7) "getUser"
[1]=>
&array(0)
[4]=>
array(6)
["file"]=>
string(31) "/app/www/bootstrap/compiled.php"
["line"]=>
int(5784)
["function"]=>
string(10) "callAction"
["class"]=>
string(29) "Illuminate\Routing\Controller"
["type"]=>
string(2) "->"
["args"]=>
array(2)
[0]=>
&string(7) "getUser"
[1]=>
&array(0)
[5]=>
array(6)
["file"]=>
string(31) "/app/www/bootstrap/compiled.php"
["line"]=>
int(5772)
["function"]=>
string(4) "call"
["class"]=>
string(39) "Illuminate\Routing\ControllerDispatcher"
["type"]=>
string(2) "->"
["args"]=>
array(3)
[0]=>
object(FacebookController)#128 (3)
["beforeFilters":protected]=>
array(0)
["afterFilters":protected]=>
array(0)
["layout":protected]=>
NULL
[1]=>
object(Illuminate\Routing\Route)#143 (8)
["uri":protected]=>
string(52) "facebook/user/one?/two?/three?/four?/five?"
["methods":protected]=>
array(2)
[0]=>
string(3) "GET"
[1]=>
string(4) "HEAD"
["action":protected]=>
array(3)
["uses"]=>
object(Closure)#144 (2)
["static"]=>
array(2)
["d"]=>
object(Illuminate\Routing\ControllerDispatcher)#137 (2)
["filterer":protected]=>
object(Illuminate\Routing\Router)#109 (14)
["events":protected]=>
object(Illuminate\Events\Dispatcher)#14 (5)
["container":protected]=>
object(Illuminate\Foundation\Application)#2 (16)
["booted":protected]=>
bool(true)
["bootingCallbacks":protected]=>
array(0)
["bootedCallbacks":protected]=>
array(2)
[0]=>
object(Closure)#74 (2)
["static"]=>
array(2)
["app"]=>
*RECURSION*
["me"]=>
object(Illuminate\View\ViewServiceProvider)#67 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
["this"]=>
object(Illuminate\View\ViewServiceProvider)#67 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[1]=>
object(Closure)#46 (1)
["static"]=>
array(2)
["app"]=>
*RECURSION*
["env"]=>
string(10) "production"
["finishCallbacks":protected]=>
array(0)
["shutdownCallbacks":protected]=>
array(0)
["middlewares":protected]=>
array(0)
["serviceProviders":protected]=>
array(11)
[0]=>
object(Illuminate\Events\EventServiceProvider)#11 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[1]=>
object(Illuminate\Exception\ExceptionServiceProvider)#15 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[2]=>
object(Illuminate\Routing\RoutingServiceProvider)#26 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[3]=>
object(Illuminate\Cookie\CookieServiceProvider)#48 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[4]=>
object(Illuminate\Database\DatabaseServiceProvider)#51 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[5]=>
object(Illuminate\Encryption\EncryptionServiceProvider)#56 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[6]=>
object(Illuminate\Filesystem\FilesystemServiceProvider)#59 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[7]=>
object(Illuminate\Session\SessionServiceProvider)#62 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[8]=>
object(Illuminate\View\ViewServiceProvider)#67 (2)
["app":protected]=>
*RECURSION*
["defer":protected]=>
bool(false)
[9]=>
object(Illuminate\Workbench\WorkbenchService…
【问题讨论】:
您收到的错误信息是什么?我们无法在不知道您遇到什么问题的情况下为您调试。 我将它托管在 heroku 中。他们没有显示任何错误。他们只是说有一个错误。 您尚未完成登录流程。你到底在哪里打电话给$session = $helper->getSessionFromRedirect();
,这就完成了code
与Facebookaccess_token
的交换?
【参考方案1】:
我只是猜测它与我在使用新的 Facebook PHP SDK 时遇到的问题相同。 您可能遇到的问题是 FacebookRedirectLoginHelper 中的 storeState 和 loadState 方法使用与 Laravel Session 不同的 PHP 会话方法。
这是我为解决该问题所做的。您基本上必须创建自己的类并扩展 FacebookRedirectLoginHelper
类似的东西。
<?php namespace Ninjaparade\Fbuser\Repo;
use Session;
class NPFacebookRedirectLoginHelper extends \Facebook\FacebookRedirectLoginHelper
protected function storeState($state)
Session::put('state', $state);
protected function loadState()
return $this->state = Session::get('state');
然后你可以在你的登录方法中做以下事情。
public function getLogin()
$helper = new NPFacebookRedirectLoginHelper(url('facebook/user'));
return Redirect::to($helper->getLoginUrl());
【讨论】:
感谢您的回答。问题不在于登录方法。问题出在用户方法上。在我登录后,我无法显示经过身份验证的用户的个人资料。 那是因为你还没有完成授权事务,你的会话状态没有被正确设置和加载。 我仍然收到错误消息。好像您已经将新的 sdk 与 laravel 一起使用。确定用户功能没有问题? 如果您实际粘贴堆栈错误会非常有帮助。 只是好奇,您是否真的按照我的描述尝试更新会话方法,因为这里有什么问题。以上是关于无法在 Laravel 4 中使用 Facebook 的 PHP SDK 获取用户个人资料的主要内容,如果未能解决你的问题,请参考以下文章