我正在尝试获取用户访问令牌,因此我可以通过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]);
}
}
答案 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来获取您之后的内容。