idci/guzzle-bundle-knpu-oauth2-plugin

此包集成了 KnpU OAuth2 功能,使用 Guzzle Bundle 插件。

v1.0.0 2023-10-04 22:30 UTC

This package is auto-updated.

Last update: 2024-09-06 15:52:44 UTC


README

此包集成了 KnpU OAuth2 功能,使用 Guzzle Bundle 插件。

此包深受以下工作的启发: gregurco/guzzle-bundle-oauth2-plugin。OAuth2 协商以检索 AccessToken 由 knpuniversity/oauth2-client-bundleleague/oauth2-client 处理。

安装

使用 composer

$ composer require idci/guzzle-bundle-knpu-oauth2-plugin

启用包

如需覆盖 registerBundles 函数,请按照以下方式在 src/Kernel.php 中进行操作

    public function registerBundles(): iterable
    {
        $contents = require $this->getBundlesPath();
        foreach ($contents as $class => $envs) {
            if ($envs[$this->environment] ?? $envs['all'] ?? false) {
                if ($class === \EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundle::class) {
                    yield new $class([
                        new \IDCI\Bundle\GuzzleBundleKnpUOAuth2Plugin\IDCIGuzzleBundleKnpUOAuth2Plugin(),
                    ]);
                } else {
                    yield new $class();
                }
            }
        }
    }

配置

按照 官方文档 中的说明配置您的 KnpUOAuth2 客户端,在 config/packages/knpu_oauth2_client.yaml 中。以下是一个使用 Keycloak 客户端的示例

knpu_oauth2_client:
    clients:
        my_keycloak_client:
            type: keycloak
            auth_server_url: '%env(string:KEYCLOAK_SERVER_BASE_URL)%'
            realm: '%env(string:KEYCLOAK_REALM)%'
            client_id: '%env(string:KEYCLOAK_CLIENT_ID)%'
            client_secret: '%env(string:KEYCLOAK_CLIENT_SECRET)%'
            redirect_route: null
            redirect_params: { }
            # encryption_algorithm: null # Optional: Encryption algorith, i.e. RS256
            # encryption_key_path: null # Optional: Encryption key path, i.e. ../key.pem
            # encryption_key: null # Optional: Encryption key, i.e. contents of key or certificate
            # version: '20.0.1' # Optional: The keycloak version to run against
            # use_state: false # whether to check OAuth2 "state": defaults to true

然后,当您想自动将 bearer 令牌添加到您的 Guzzle 客户端请求中时,只需在 config/packages/eight_points_guzzle.yaml 中使用 knpu_oauth2 插件配置。以下是一个使用 my_keycloak_client KnpUOAuth2 客户端的示例

eight_points_guzzle:
    clients:
        my_guzzle_client:
            base_url: '%env(string:MY_GUZZLE_CLIENT_ENV_BASE_URL)%'
            options:
                auth: knpu_oauth2
            plugin:
                knpu_oauth2:
                    client: my_keycloak_client

如果您想存储您的 bearer 令牌,可以使用 persistent 选项设置为 true。默认情况下,此包使用 cache.app 服务来存储 bearer 令牌,但您可以使用 cache_service_id 选项更改此设置。以下是一个使用自定义 Symfony\Component\Cache\Adapter\RedisAdapter 服务的示例来存储您的 bearer 令牌

config/services.yaml:

services:
    app.redis_provider:
        class: \Redis
        factory: ['Symfony\Component\Cache\Adapter\RedisAdapter', 'createConnection']
        arguments:
            - 'redis://%env(resolve:REDIS_HOST)%'

    app.cache.adapter.redis.keycloak:
        parent: 'cache.adapter.redis'
        tags:
            - { name: 'cache.pool', namespace: 'KEYCLOAK' }

config/packages/cache.yaml:

framework:
    cache:
        pools:
            app.keycloak.cache:
                default_lifetime: 600 # Ten minutes
                adapter: app.cache.adapter.redis.keycloak
                provider: app.redis_provider

config/packages/eight_points_guzzle.yaml:

eight_points_guzzle:
    clients:
        my_guzzle_client:
            base_url: '%env(string:MY_GUZZLE_CLIENT_ENV_BASE_URL)%'
            options:
                auth: knpu_oauth2
            plugin:
                knpu_oauth2:
                    client: my_keycloak_client
                    persistent: true
                    cache_service_id: app.keycloak.cache