在laravel 5.4上使用socialite检索facebook用户访问令牌

时间:2018-01-19 23:00:27

标签: php facebook laravel facebook-graph-api laravel-socialite

我正在尝试获取用户访问令牌,因此我可以通过Guzzle将CURL请求发送到Facebook的Graph API,以获取正在使用该应用的用户的朋友。但我似乎无法获得它。 这是我的控制器:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use Socialite;

class SocialFriendsController extends Controller
{

    public function getFacebookFriends()
    {

    $user = Socialite::driver('facebook')->user();
    $access_token = $user->token;

    $client = new Client();
    $body = $client->get('https://graph.facebook.com/v2.11/me/friends', [
        'query' => [
            'access_token' => '$access_token',
        ]
    ])->getBody();

        $result = \GuzzleHttp\json_decode($body, 1);
    return view('pages.admin.posts.create', ['result' => $result]);
   }

}

2 个答案:

答案 0 :(得分:2)

按照上一个答案修复对$access_token的引用后,您可以使用facebook SDK执行以下步骤,从Facebook检索长期存在的令牌,以便您可以多次调用API。默认身份验证令牌将工作2小时,之后您需要重新启动oAuth流以获取新令牌。一个长期存在的令牌会让你获得2个月的访问权限,然后再次进行oAuth。 https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension

$facebook = new \Facebook\Facebook();
$client = $facebook->getOAuth2Client();
$twoMonthToken = $client->getLongLivedAccessToken($twoHourToken);

使用$twoMonthToken

更新用户

答案 1 :(得分:1)

有几点需要注意。首先,代码的以下部分不会像您期望的那样工作:

'access_token' => '$access_token',

您正在尝试进行变量插值,这在使用单引号(')时不起作用。您应该使用双引号("$access_token"),或者因为您实际上没有对该字符串执行任何其他操作,所以您可以完全删除引号。

其次,在进行Facebook登录时(在您的情况下,使用Socialite),您从Facebook收到的访问令牌是一次性使用(我认为无论如何 - 至少从我自己的经验来看)。当您执行Socialite::driver('facebook')->user()时,Socialite实际上正在使用访问令牌来获取用户对象。如果您再次尝试使用它,Facebook将返回错误。

社交名流可能不是实现你想要做的事情的方法。我建议您直接使用Facebook SDK来获取您之后的内容。