问题
I am using the laravel-oauth2 package for Laravel 4 to set up a Facebook login. I am using the package seen here: https://github.com/madewithlove/laravel-oauth2
When running the page that controls the login, the public/oauth/facebook, the Facebook prompt comes up fine, but when I click "accept", the page spits out the following error:
ErrorException
Argument 1 passed to OAuth2\Provider\Facebook::get_user_info() must be an instance of OAuth2\Token\Token_Access, instance of OAuth2\Token_Access given, called in /Applications/MAMP/htdocs/crowdsets/laravel-master/app/controllers/Oauth2Controller.php on line 36 and defined
It is pointing to /vendor/taylorotwell/laravel-oauth2/src/OAuth2/Provider/Facebook.php: 26
The get_user_info()
function in Facebook.php looks like this:
public function get_user_info(Token_Access $token)
{
$url = 'https://graph.facebook.com/me?'.http_build_query(array(
'access_token' => $token->access_token,
));
$user = json_decode(file_get_contents($url));
// Create a response from the request
return array(
'uid' => $user->id,
'nickname' => $user->username,
'name' => $user->name,
'email' => $user->email,
'location' => $user->hometown->name,
'description' => $user->bio,
'image' => 'https://graph.facebook.com/me/picture?type=normal&access_token='.$token->access_token,
'urls' => array(
'Facebook' => $user->link,
),
);
}
My Oauth2Controller.php file looks like this:
<?php
use OAuth2\OAuth2;
use OAuth2\Token_Access;
use OAuth2\Exception as OAuth2_Exception;
class Oauth2Controller extends BaseController
{
public function getIndex($provider) {
$provider = OAuth2::provider($provider, array(
'id' => '****************',
'secret' => '********************',
));
if(! isset($_GET['code'])) {
return $provider->authorize();
}
else
{
// Howzit?
try
{
$params = $provider->access($_GET['code']);
$token = new Token_Access(array(
'access_token' => $params->access_token
));
$user = $provider->get_user_info($token);
// Here you should use this information to A) look for a user B) help a new user sign up with existing data.
// If you store it all in a cookie and redirect to a registration page this is crazy-simple.
echo "<pre>";
var_dump($user);
}
catch (OAuth2_Exception $e)
{
show_error('That didnt work: '.$e);
}
}
}
}
I am not sure why it is given me this error, as I followed the documentation and tutorials. Thank you for your help with solving this issue.
回答1:
I studied the source code to the package and it appears to be an error in the Facebook Provider (actually most of the providers)
In the beginning of the Facebook provider for instance it does this:
<?php
use OAuth2\Token\Token_Access;
There is actually no class in the OAuth2\Token namespace. There is however one in the OAuth2 namespace. So replacing the value above with
<?php
use OAuth2\Token_Access;
Should fix your error. You should do this for all the Providers.
PSR namespacing standards dictates underscores map to directories. So OAuth\Token_Access
class will generally be looked for in the ./OAuth/Token/Access.php
file
来源:https://stackoverflow.com/questions/17332530/laravel-oauth2-issue-in-laravel-4