laravel 5.4 上的社交名流检索 facebook 用户访问令牌
Retrieving facebook user access token with socialite on laravel 5.4
我正在尝试获取用户访问令牌,以便我可以通过 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]);
}
}
有几点需要注意。首先,您的代码的以下部分不会按您期望的方式工作:
'access_token' => '$access_token',
您正在尝试进行变量插值,但在您使用单引号 ('
) 时不起作用。您应该改用双引号 ("$access_token"
),或者因为您实际上没有对该字符串执行任何其他操作,所以您可以完全删除引号。
其次,在进行 Facebook 登录时(在您的情况下,使用 Socialite),您从 Facebook 收到的访问令牌是一次性使用的(无论如何我是这么认为的 - 至少根据我自己的经验)。当您执行 Socialite::driver('facebook')->user()
时,Socialite 实际上是在使用访问令牌来获取用户对象。如果您再次尝试使用它,Facebook 将 return 出错。
社交名流可能不是实现您想要做的事情的途径。我建议直接使用 Facebook SDK 来得到你想要的。
按照之前的答案修复对 $access_token
的引用后,您可以使用 facebook SDK 执行以下步骤以从 Facebook 检索长期存在的令牌,这样您就可以多次调用 API。默认身份验证令牌将工作 2 小时,之后您将需要重新启动 oAuth 流程以获取新令牌。一个长寿命的令牌可以让你在必须再次执行 oAuth 之前获得 2 个月的访问权限。
https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension
$facebook = new \Facebook\Facebook();
$client = $facebook->getOAuth2Client();
$twoMonthToken = $client->getLongLivedAccessToken($twoHourToken);
更新用户 $twoMonthToken
$user = Socialite::driver('facebook')->userFromToken($access_token);
您只需像上面那样传递您的 access_token 即可 return 用户信息。
我正在尝试获取用户访问令牌,以便我可以通过 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]);
}
}
有几点需要注意。首先,您的代码的以下部分不会按您期望的方式工作:
'access_token' => '$access_token',
您正在尝试进行变量插值,但在您使用单引号 ('
) 时不起作用。您应该改用双引号 ("$access_token"
),或者因为您实际上没有对该字符串执行任何其他操作,所以您可以完全删除引号。
其次,在进行 Facebook 登录时(在您的情况下,使用 Socialite),您从 Facebook 收到的访问令牌是一次性使用的(无论如何我是这么认为的 - 至少根据我自己的经验)。当您执行 Socialite::driver('facebook')->user()
时,Socialite 实际上是在使用访问令牌来获取用户对象。如果您再次尝试使用它,Facebook 将 return 出错。
社交名流可能不是实现您想要做的事情的途径。我建议直接使用 Facebook SDK 来得到你想要的。
按照之前的答案修复对 $access_token
的引用后,您可以使用 facebook SDK 执行以下步骤以从 Facebook 检索长期存在的令牌,这样您就可以多次调用 API。默认身份验证令牌将工作 2 小时,之后您将需要重新启动 oAuth 流程以获取新令牌。一个长寿命的令牌可以让你在必须再次执行 oAuth 之前获得 2 个月的访问权限。
https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension
$facebook = new \Facebook\Facebook();
$client = $facebook->getOAuth2Client();
$twoMonthToken = $client->getLongLivedAccessToken($twoHourToken);
更新用户 $twoMonthToken
$user = Socialite::driver('facebook')->userFromToken($access_token);
您只需像上面那样传递您的 access_token 即可 return 用户信息。