qbnk / guzzle-oauth2-plugin
适用于 Guzzle ^7.0 的 OAuth2 中间件,由 sainsburys/guzzle-oauth2-plugin 衍生而来
v4.0.1
2020-09-15 11:11 UTC
Requires
- php: >=7.2
- firebase/php-jwt: ^3.0|^4.0|^5.0
- guzzlehttp/guzzle: ^7.0
Requires (Dev)
- phpunit/phpunit: ^5.7
README
Sainsbury's guzzle-oauth2-plugin
为 Guzzle 提供一个 OAuth2 插件(中间件)。
版本 4.x(在 master
分支上)适用于 Guzzle 7 - 需要 php >=7.2
"qbnk/guzzle-oauth2-plugin": "^4.0"
版本 3.x(在 master
分支上)适用于 Guzzle 6
"sainsburys/guzzle-oauth2-plugin": "^3.0"
版本 2.x(在 release/2.0
分支上)适用于 Guzzle 5
"sainsburys/guzzle-oauth2-plugin": "^2.0"
版本 1.x(在 release/1.0
分支上)适用于 Guzzle 3 [不再维护]
"sainsburys/guzzle-oauth2-plugin": "^1.0"
功能
- 通过支持的授权类型之一(代码、客户端凭据、用户凭据、刷新令牌)获取访问令牌。或者您可以自己设置访问令牌。
- 支持刷新令牌(存储它们并使用它们来获取新的访问令牌)。
- 处理令牌过期(获取新的令牌并重试失败的请求)。
运行测试
首先,通过运行 composer install --prefer-dist
确保所有依赖项都已就绪,然后简单运行 .vendor/bin/phpunit
。
示例
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Sainsburys\Guzzle\Oauth2\GrantType\RefreshToken;
use Sainsburys\Guzzle\Oauth2\GrantType\PasswordCredentials;
use Sainsburys\Guzzle\Oauth2\Middleware\OAuthMiddleware;
$baseUri = 'https://example.com';
$config = [
PasswordCredentials::CONFIG_USERNAME => 'test@example.com',
PasswordCredentials::CONFIG_PASSWORD => 'test password',
PasswordCredentials::CONFIG_CLIENT_ID => 'test-client',
PasswordCredentials::CONFIG_TOKEN_URL => '/oauth/token',
'scope' => 'administration',
];
$oauthClient = new Client(['base_uri' => $baseUri]);
$grantType = new PasswordCredentials($oauthClient, $config);
$refreshToken = new RefreshToken($oauthClient, $config);
$middleware = new OAuthMiddleware($oauthClient, $grantType, $refreshToken);
$handlerStack = HandlerStack::create();
$handlerStack->push($middleware->onBefore());
$handlerStack->push($middleware->onFailure(5));
$client = new Client(['handler'=> $handlerStack, 'base_uri' => $baseUri, 'auth' => 'oauth2']);
$response = $client->request('GET', '/api/user/me');
// Use $middleware->getAccessToken(); and $middleware->getRefreshToken() to get tokens
// that can be persisted for subsequent requests.
使用 Symfony DI 配置的示例
<container xmlns="https://symfony.ac.cn/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://symfony.ac.cn/schema/dic/services https://symfony.ac.cn/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="acme.base_uri">https://example.com</parameter>
<parameter key="acme.oauth.config" type="collection">
<parameter key="username">test@example.com</parameter>
<parameter key="password">test password</parameter>
<parameter key="client_id">test-client</parameter>
<parameter key="token_url">/oauth/token</parameter>
</parameter>
</parameters>
<services>
<service id="acme.oauth.guzzle.client" class="GuzzleHttp\Client" public="false">
<argument type="collection">
<argument key="base_uri">%acme.base_uri%</argument>
</argument>
</service>
<service id="acme.oauth.grant_type" class="Sainsburys\Guzzle\Oauth2\GrantType\PasswordCredentials" public="false">
<argument type="service" id="acme.oauth.guzzle.client"/>
<argument>%acme.oauth.config%</argument>
</service>
<service id="acme.oauth.refresh_token" class="Sainsburys\Guzzle\Oauth2\GrantType\RefreshToken" public="false">
<argument type="service" id="acme.oauth.guzzle.client"/>
<argument>%acme.oauth.config%</argument>
</service>
<service id="acme.oauth.middleware" class="Sainsburys\Guzzle\Oauth2\Middleware\OAuthMiddleware" public="false">
<argument type="service" id="acme.oauth.guzzle.client"/>
<argument type="service" id="acme.oauth.grant_type"/>
<argument type="service" id="acme.oauth.refresh_token"/>
</service>
<service id="acme.guzzle.handler" class="GuzzleHttp\HandlerStack" public="false">
<factory class="GuzzleHttp\HandlerStack" method="create"/>
<call method="push">
<argument type="service">
<service class="Closure">
<factory service="acme.oauth.middleware" method="onBefore"/>
</service>
</argument>
</call>
<call method="push">
<argument type="service">
<service class="Closure">
<factory service="acme.oauth.middleware" method="onFailure"/>
<argument>5</argument>
</service>
</argument>
</call>
</service>
<service id="acme.guzzle.client" class="GuzzleHttp\Client">
<argument type="collection">
<argument key="handler" type="service" id="acme.guzzle.handler" />
<argument key="base_uri">%acme.base_uri%</argument>
<argument key="auth">oauth2</argument>
</argument>
</service>
</services>
</container>