piv915 / oauth2-facebook
The PHP League OAuth2-Client 的 Facebook OAuth 2.0 客户端提供者
Requires
- php: >=5.5.0
- league/oauth2-client: ~1.0
Requires (Dev)
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0
- squizlabs/php_codesniffer: ~2.0
This package is not auto-updated.
Last update: 2024-10-02 09:24:01 UTC
README
本包为 PHP League OAuth 2.0 Client 提供了 Facebook OAuth 2.0 支持。
本包符合 PSR-1、PSR-2、PSR-4 和 PSR-7 规范。如果发现符合性疏漏,请通过 pull request 发送补丁。
要求
以下版本的 PHP 被支持。
- PHP 5.5
- PHP 5.6
- PHP 7.0
- HHVM
安装
将以下内容添加到您的 composer.json 文件中。
{
"require": {
"league/oauth2-facebook": "~1.0"
}
}
用法
授权码流程
session_start(); $provider = new League\OAuth2\Client\Provider\Facebook([ 'clientId' => '{facebook-app-id}', 'clientSecret' => '{facebook-app-secret}', 'redirectUri' => 'https://example.com/callback-url', 'graphApiVersion' => 'v2.4', ]); if (!isset($_GET['code'])) { // If we don't have an authorization code then get one $authUrl = $provider->getAuthorizationUrl([ 'scope' => ['email', '...', '...'], ]); $_SESSION['oauth2state'] = $provider->getState(); echo '<a href="'.$authUrl.'">Log in with Facebook!</a>'; exit; // Check given state against previously stored one to mitigate CSRF attack } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); echo 'Invalid state.'; exit; } // Try to get an access token (using the authorization code grant) $token = $provider->getAccessToken('authorization_code', [ 'code' => $_GET['code'] ]); // Optional: Now you have a token you can look up a users profile data try { // We got an access token, let's now get the user's details $user = $provider->getResourceOwner($token); // Use these details to create a new profile printf('Hello %s!', $user->getFirstName()); echo '<pre>'; var_dump($user); # object(League\OAuth2\Client\Provider\FacebookUser)#10 (1) { ... echo '</pre>'; } catch (Exception $e) { // Failed to get user details exit('Oh dear...'); } echo '<pre>'; // Use this to interact with an API on the users behalf var_dump($token->getToken()); # string(217) "CAADAppfn3msBAI7tZBLWg... // Number of seconds until the access token will expire, and need refreshing var_dump($token->getExpires()); # int(1436825866) echo '</pre>';
FacebookUser 实体
当使用 getResourceOwner() 方法获取用户节点时,它将以 FacebookUser 实体的形式返回。
$user = $provider->getResourceOwner($token); $id = $user->getId(); var_dump($id); # string(1) "4" $name = $user->getName(); var_dump($name); # string(15) "Mark Zuckerberg" $firstName = $user->getFirstName(); var_dump($firstName); # string(4) "Mark" $lastName = $user->getLastName(); var_dump($lastName); # string(10) "Zuckerberg" # Requires the "email" permission $email = $user->getEmail(); var_dump($email); # string(15) "thezuck@foo.com" # Requires the "user_hometown" permission $hometown = $user->getHometown(); var_dump($hometown); # array(10) { ["id"]=> string(10) "12345567890" ... # Requires the "user_about_me" permission $bio = $user->getBio(); var_dump($bio); # string(426) "All about me... $pictureUrl = $user->getPictureUrl(); var_dump($pictureUrl); # string(224) "https://fbcdn-profile-a.akamaihd.net/hprofile- ... $gender = $user->getGender(); var_dump($gender); # string(4) "male" $locale = $user->getLocale(); var_dump($locale); # string(5) "en_US" $link = $user->getLink(); var_dump($link); # string(62) "https://#/app_scoped_user_id/1234567890/"
您还可以使用 toArray() 方法将用户节点的所有数据作为一个普通的 PHP 数组获取。
$userData = $user->toArray();
Graph API 版本
需要 graphApiVersion 选项。如果没有设置,将抛出 \InvalidArgumentException。
$provider = new League\OAuth2\Client\Provider\Facebook([ /* . . . */ 'graphApiVersion' => 'v2.4', ]);
Graph API 的每个版本之间都有破坏性的更改。此包不再支持回退到默认的 Graph 版本,因为当回退的 Graph 版本更新时,您的应用程序可能会损坏。
有关更多信息,请参阅 Graph API 版本计划。
测试版层
Facebook 有一个 测试版层,其中包含在投入生产之前发布的最新部署。要启用测试版层,请将 enableBetaTier 选项设置为 true。
$provider = new League\OAuth2\Client\Provider\Facebook([ /* . . . */ 'enableBetaTier' => true, ]);
刷新令牌
Facebook 不支持刷新令牌。为了获取新的“刷新”令牌,您必须再次通过登录-with-Facebook 流程将用户发送。
请参阅 Facebook 文档
一旦 [访问令牌] 过期,您的应用程序必须将用户再次通过登录流程发送,以生成一个新的短期令牌。
以下代码将抛出 League\OAuth2\Client\Provider\Exception\FacebookProviderException。
$grant = new \League\OAuth2\Client\Grant\RefreshToken(); $token = $provider->getAccessToken($grant, ['refresh_token' => $refreshToken]);
长期访问令牌
Facebook 允许您通过 使用短期访问令牌交换长期访问令牌 来延长访问令牌的有效期。
一旦您获取了短期(默认)访问令牌,您就可以将其交换为长期令牌。
try { $token = $provider->getLongLivedAccessToken('short-lived-access-token'); } catch (Exception $e) { echo 'Failed to exchange the token: '.$e->getMessage(); exit(); } var_dump($token->getToken()); # string(217) "CAADAppfn3msBAI7tZBLWg...
测试
$ ./vendor/bin/phpunit
贡献
有关详细信息,请参阅 CONTRIBUTING。
致谢
许可协议
MIT 许可协议 (MIT)。有关更多信息,请参阅 许可文件。