serg-php / freelancer-oauth2-client
Freelancer OAuth 2.0 客户端提供者
Requires
- php: >=8.0.1
- league/oauth2-client: ^2.6.1
This package is auto-updated.
Last update: 2024-09-20 21:57:47 UTC
README
此包使得将您的应用程序与 Freelancer OAuth 2.0 服务提供者集成变得简单。
要求
以下版本的 PHP 受支持。
- PHP 8.0
- HHVM
使用方法
初始化 Freelancer OAuth2 提供者
在开始使用此客户端之前,建议您先了解 OAuth。有关 OAuth2 的介绍,请参阅 https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2,或通过电子邮件向 Freelancer 身份团队咨询 (identity@freelancer.com)。
注意:在开始之前,请从 http://accounts.freelancer.com/settings/create_app 创建您的应用程序并获取批准
require __DIR__ . '/vendor/autoload.php'; use Sergphp\OAuth2\Client\Provider\FreelancerIdentity; use Sergphp\OAuth2\Client\Provider\FreelancerIdentityException; $provider = new FreelancerIdentity([ 'clientId' => '<your-client-id>', 'clientSecret' => '<your-client-secret>', 'redirectUri' => '<your-client-redirect-uri>', 'scopes' => [<scopes-array>], // Optional only needed when retrieve access token 'prompt' => [<prompt-step-array>], // Optional only needed when retrieve access token 'advancedScopes' => [<advanced-scopes-array>], // Optional only needed when retrieve access token 'sandbox' => true, // to play with https://accounts.freelancer-sandbox.com ]);
授权码授予
授权码授予类型是在使用 Freelancer 服务进行用户身份验证时最常用的授权类型。此授权类型使用客户端(此库)、服务器(服务提供者)和资源所有者(拥有受保护或拥有的资源的凭证的用户)来请求访问用户拥有的资源。这通常被称为三方 OAuth,因为它涉及三个实体。
// Check given error if (isset($_GET['error'])) { exit($_GET['error']); } elseif (!isset($_GET['code'])) { // If we don't have an authorization code then get one // Fetch the authorization URL from the provider; this returns the // urlAuthorize option and generates and applies any necessary parameters $authorizationUrl = $provider->getAuthorizationUrl(); // Redirect the user to the authorization URL. header('Location: ' . $authorizationUrl); exit; } else { try { // Try to get an access token using the authorization code grant. $accessToken = $provider->getAccessToken('authorization_code', [ 'code' => $_GET['code'] ]); // Store this bearer token in your data store for future use // including these information // token_type, expires_in, scope, access_token and refresh_token storeAccessTokenInYourDataStore($provider->accessTokenArray); // We have an access token, which we may use in authenticated // requests against the freelancer identity and freelancer API. echo $accessToken->getToken() . "\n"; echo $accessToken->getRefreshToken() . "\n"; echo $accessToken->getExpires() . "\n"; echo ($accessToken->hasExpired() ? 'expired' : 'not expired') . "\n"; // Using the access token, we may look up details about the // resource owner. $resourceOwner = $provider->getResourceOwner($accessToken); var_export($resourceOwner); } catch (FreelancerIdentityException $e) { // Failed to get the access token or user details. exit($e->getMessage()); } }
向 Freelancer API 服务发送授权请求。
为了从您的应用程序中调用 Freelancer API,您的应用程序需要在创建时具有某些高级范围,然后您可以在获取访问令牌时请求用户授予这些高级范围。
示例:使用 POST https://www.freelancer.com/api/projects/0.1/projects/ 文档参考:https://www.freelancer.com/api/docs/#create-new-project 您的应用程序需要在创建时具有 'fln:project:create' 高级范围,并且您的用户需要在同意此范围后,现在授予的访问令牌将具有调用此端点的权限。
$provider = new FreelancerIdentity(); try { $tokenArray = getAccessTokenFromYourDataStore(); $provider->setAccessTokenFromArray($tokenArray); if (!$provider->accessToken->hasExpired()) { $request = $provider->getAuthenticatedRequest( 'POST', $provider->apiBaseUri.'/projects/0.1/projects/', [ "headers" => ["Content-Type" => "application/json"], "body" => '{ "title": "Build my Super Website!", "description": "I need this website to make visual basic GUIs", "currency": { "id": 1 }, "budget": { "minimum": 300 }, "jobs": [ { "id": 7 }, { "id": 3 } ] }' ] ); $response = $provider->getResponse($request); var_export($response); } else { // refresh your token } } catch (FreelancerIdentityException $e) { // Failed to get response exit($e->getMessage()); }
刷新令牌
一旦您的应用程序获得授权,您可以使用刷新令牌来刷新过期的令牌,而无需从头开始获取全新令牌的整个过程。为此,只需从您的数据存储中重新使用此刷新令牌来请求刷新。
$provider = new FreelancerIdentity([ 'clientId' => '<your-client-id>', ]); $existingAccessTokenArray = getAccessTokenFromYourDataStore(); $provider->setAccessTokenFromArray($existingAccessTokenArray); try { if ($provider->accessToken->hasExpired()) { $newAccessToken = $provider->getAccessToken('refresh_token', [ 'refresh_token' => $provider->accessToken->getRefreshToken() ]); // Purge old access token and store new access token to your data store. } } catch (FreelancerIdentityException $e) { // Failed to refresh token exit($e->getMessage()); }
客户端凭证授予
当您的应用程序代表自身访问其控制/拥有的资源时,它可以使用客户端凭证授予类型。当您的应用程序的凭证是私密存储且从未暴露给最终用户时(例如,通过网页浏览器等),这最适合使用。此授权类型与资源所有者密码凭证授权类型的功能类似,但它不请求用户的用户名或密码。它只使用服务提供者颁发给您的客户端的客户端 ID 和密钥。
try { // Try to get an access token using the client credentials grant. $accessToken = $provider->getAccessToken('client_credentials'); // Store this bearer token in your data store for future use // including these information // token_type, expires_in, scope and access_token storeAccessTokenInYourDataStore($provider->accessTokenArray); } catch (FreelancerIdentityException $e) { // Failed to get the access token exit($e->getMessage()); }
安装
通过 Composer
$ composer require serg-php/freelancer-oauth2-client -o
许可
MIT 许可证 (MIT)。请参阅 许可文件 获取更多信息。