league / oauth2-linkedin
PHP League OAuth2-Client 的 LinkedIn OAuth 2.0 客户端提供者
Requires
- league/oauth2-client: ^2.0
Requires (Dev)
- ext-json: *
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0
- squizlabs/php_codesniffer: ~2.0
README
本包为 PHP League 的 OAuth 2.0 客户端 提供LinkedIn OAuth 2.0 支持。
开始之前
LinkedIn API 已大部分关闭,仅对经过批准的 LinkedIn 开发者开放。您可以在以下链接请求授权 - https://business.linkedin.com/marketing-solutions/marketing-partners/become-a-partner/marketing-developer-program
您可能能够使用此包成功获取访问令牌,但仍未经授权访问 API 中的某些资源。
如果您遇到以下情况或类似情况,则此策略正在实施。
{
"serviceErrorCode": 100,
"message": "Not enough permissions to access: GET /me",
"status": 403
}
安装
要安装,请使用 composer
composer require league/oauth2-linkedin
用法
用法与 The League 的 OAuth 客户端相同,使用 \League\OAuth2\Client\Provider\LinkedIn
作为提供者。
授权码流
$provider = new League\OAuth2\Client\Provider\LinkedIn([ 'clientId' => '{linkedin-client-id}', 'clientSecret' => '{linkedin-client-secret}', 'redirectUri' => 'https://example.com/callback-url', ]); if (!isset($_GET['code'])) { // If we don't have an authorization code then get one $authUrl = $provider->getAuthorizationUrl(); $_SESSION['oauth2state'] = $provider->getState(); header('Location: '.$authUrl); exit; // Check given state against previously stored one to mitigate CSRF attack } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); exit('Invalid state'); } else { // 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()); } catch (Exception $e) { // Failed to get user details exit('Oh dear...'); } // Use this to interact with an API on the users behalf echo $token->getToken(); }
管理作用域
在创建 LinkedIn 授权 URL 时,您可以指定应用程序可能授权的状态和作用域。
$options = [ 'state' => 'OPTIONAL_CUSTOM_CONFIGURED_STATE', 'scope' => ['r_liteprofile','r_emailaddress'] // array or string ]; $authorizationUrl = $provider->getAuthorizationUrl($options);
如果两者都没有定义,则提供者将使用内部默认值。
在编写本文档时,以下作用域可用。
- r_liteprofile (默认请求)
- r_emailaddress (默认请求)
- r_fullprofile
- w_member_social
- rw_company_admin
检索 LinkedIn 成员信息
在检索资源所有者详细信息时,提供者允许返回显式的字段列表,前提是它们允许使用检索访问令牌的作用域。
提供默认字段集。使用 withFields
方法重写这些默认值并定义一组新字段非常简单,这是一个返回更新提供者的流畅方法。
您可以在 LinkedIn 开发者文档中找到字段的完整列表
$fields = [ 'id', 'firstName', 'lastName', 'maidenName', 'headline', 'vanityName', 'birthDate', 'educations' ]; $provider = $provider->withFields($fields); $member = $provider->getResourceOwner($token); // or in one line... $member = $provider->withFields($fields)->getResourceOwner($token);
getResourceOwner
将返回 League\OAuth2\Client\Provider\LinkedInResourceOwner
的实例,该实例提供一些有用的获取方法来访问基本成员信息。
为了进行更多定制和控制,LinkedInResourceOwner
对象还提供了一个 getAttribute
方法,它接受一个字符串来访问可能未明确定义获取方法的特定属性。
$firstName = $member->getFirstName(); $birthDate = $member->getAttribute('birthDate');
关于获取资源所有者电子邮件地址的说明
电子邮件必须由提供者通过单独的请求获取,它不是配置文件的字段之一。
在获取资源所有者的电子邮件地址时,将尝试进行第二次请求来获取电子邮件地址。如果提供的访问令牌未使用 r_emailaddress
范围颁发,则此请求将静默失败(并且 getEmail()
将返回 null
)。
$member = $provider->getResourceOwner($token); $email = $member->getEmail();
您还可以尝试通过单独的请求获取电子邮件。如果提供的访问令牌未使用 r_emailaddress
范围颁发,则此请求将失败并抛出异常。
$emailAddress = $provider->getResourceOwnerEmail($token);
刷新令牌
LinkedIn 已经引入了 OAuth 2.0 的刷新令牌。此功能目前仅对有限数量的合作伙伴可用。它将在不久的将来推出。 来源
如果您的LinkedIn客户端ID与支持刷新令牌的合作伙伴关联,此包将帮助您访问和使用刷新令牌。
$refreshToken = $token->getRefreshToken();
$refreshTokenExpiration = $token->getRefreshTokenExpires();
测试
$ ./vendor/bin/phpunit
贡献
请参阅贡献指南获取详细信息。
致谢
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。