aulasoftwarelibre / oauth2-uco
科尔多瓦大学客户端提供者,为PHP League OAuth2客户端提供支持
0.6.0
2022-02-27 11:39 UTC
Requires
- ext-curl: *
- league/oauth2-client: ^2.3
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- mockery/mockery: ^1.2
- phpunit/phpunit: ^9.5
README
此包为PHP的league/oauth2-client包提供OAuth 2.0认证支持。
开始之前
为了使用此包,您需要向科尔多瓦大学的信息服务申请访问凭证。
安装
要安装此库,请使用composer
composer require informaticauco/oauth2-uco
使用方法
使用方法类似于任何league/oauth2-client
提供商,但使用Uco\OAuth2\Client\Provider\Uco
作为服务提供商。
示例代码
<?php $provider = new Uco\OAuth2\Client\Provider\Uco([ 'clientId' => '{client-id}', 'clientSecret' => '{client-secret}', 'redirectUri' => 'https://servidor/redirect', ]); // Si no tenemos código de autorización, solicitamos uno if (!isset($_GET['code'])) { // Usamos el proveedor de la UCO para conseguir la URL de autorización $authorizationUrl = $provider->getAuthorizationUrl(); // Leemos el código de estado de la petición y lo guardamos en la sesión $_SESSION['oauth2state'] = $provider->getState(); // Redireccionamos al usuario al sistema de autenticación de la universidad header('Location: ' . $authorizationUrl); exit; // Comprobamos que el código de estado concuerda para evitar ataques CSRF } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); exit('Invalid state'); // El código es válido } else { try { // Intentamos obtener un token de acceso con el código de autorización. $accessToken = $provider->getAccessToken('authorization_code', [ 'code' => $_GET['code'] ]); // We have an access token, which we may use in authenticated // requests against the service provider's API. echo $accessToken->getToken() . "\n"; echo $accessToken->getRefreshToken() . "\n"; echo $accessToken->getExpires() . "\n"; echo ($accessToken->hasExpired() ? 'expired' : 'not expired') . "\n"; // Con el access token podemos acceder a los datos del usuario $resourceOwner = $provider->getResourceOwner($accessToken); echo "¡Hola {$resourceOwner->getId()}!"; // El usuario está logueado, podemos usar $token o crear nuestras // propias variables de sesión. // Redireccionamos al usuario a la página de la aplicación header('Location: /'); exit; } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { // Si ocurre un fallo al acceder a los datos del usuario exit($e->getMessage()); } }
刷新token(可选)
如果需要访问API并刷新访问token,可以使用类似的代码
<?php $provider = new Uco\OAuth2\Client\Provider\Uco([ 'clientId' => '{client-id}', 'clientSecret' => '{client-secret}', 'redirectUri' => 'https://servidor/redirect', ]); $existingAccessToken = getAccessTokenFromYourDataStore(); // $token del código anterior if ($existingAccessToken->hasExpired()) { $newAccessToken = $provider->getAccessToken('refresh_token', [ 'refresh_token' => $existingAccessToken->getRefreshToken() ]); }