afbora / oauth2-linkedin-openid
基于OpenID Connect的LinkedIn OAuth 2.0客户端提供程序,用于PHP League的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 afbora/oauth2-linkedin-openid
用法
用法与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
实例,该实例提供一些有用的getter方法来访问基本成员详细信息。
为了获得更多定制和控制,LinkedInResourceOwner
对象还提供了一个getAttribute
方法,该方法接受一个字符串以访问可能未明确定义getter方法的特定属性。
$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)。更多信息请参阅许可证文件。