kakadu-dev/yii2-jwt-auth

该扩展为 Yii2 提供JWT认证

安装数: 5,116

依赖关系: 0

建议者: 0

安全性: 0

星标: 9

关注者: 4

分支: 5

开放问题: 1

类型:yii2-extension

2.0 2020-01-08 07:39 UTC

This package is auto-updated.

Last update: 2024-09-08 18:00:50 UTC


README

Yii2 JWT 认证

安装

安装此扩展的首选方式是通过 Composer

运行以下命令

php composer.phar require --prefer-dist kakadu-dev/yii2-jwt-auth "@dev"

或者在您的 composer.json 文件的 require 部分添加以下内容

"kakadu-dev/yii2-jwt-auth": "@dev"

用法

扩展安装后,只需在代码中使用它即可

将此包迁移命名空间添加到您的控制台配置(console/config/main.php)

return [
    'components' => [
        'migrate' => [
            'class'               => yii\console\controllers\MigrateController::class,
            // set false if you use namespaces
            'migrationPath'       => '@console/migrations',
            'migrationNamespaces' => [
                // ...
                'Kakadu\Yii2JwtAuth\migrations',
            ],
        ],
    ],
];

配置API令牌组件(例如 common/config/main.php)

return [
    'components' => [
        'apiTokens' => [
            'class'           => \Kakadu\Yii2JwtAuth\ApiTokenService::class,
            'secretKey'       => '', // set in main-local.php or yii-params.domainSecretKey
            'issuer'          => 'you-domain-name', // or yii-params.domain
            'audience'        => ['you-domain-name', 'second-domain-name'], // or yii-params.domain
            'audienceSecrets' => [
                'you-domain-name'    => '', // or yii-params.domainSecretKey
                'second-domain-name' => '', // or yii-params.secondDomainSecretKey
            ],
            'seamlessLogin'   => false,
        ],
    ],
];

secretKeyissueraudienceaudienceSecrets 中所有包含 yii-params.param-name 的值将被转换为 Yii::$app->params['param-name']

待定:添加 yii-params.* 配置示例(例如 audienceSecrets)。

现在,在用户注册后,创建JWT令牌并将它们添加到响应头中。还添加了一个更新令牌的操作。
例如。

class AuthController extends yii\rest\Controller
{
    public function actionSignUp()
    {
        // After create user $newUser
        // Same actions for login url
        $tokens = \Yii::$app->apiTokens->create($newUser->id, ['someField' => 'someValue']);
        
        \Kakadu\Yii2JwtAuth\JwtBearerAuth::addJwtToHeader(\Yii::$app->response, $tokens);
    }
    
    public function actionSignIn()
    {
        // After verify user login and password
    
        $tokens = \Yii::$app->apiTokens->create($user->id, ['someField' => 'someValue']);
        
        \Kakadu\Yii2JwtAuth\JwtBearerAuth::addJwtToHeader(\Yii::$app->response, $tokens);
    }
    
    /**
     * Autologin, if access token expired and refresh token not expired.
     * This action needed only if 'seamlessLogin' set to false.
     */
    public function actionRefreshTokens()
    {
        // Get from post or headers or ...
        $accessToken = Yii::$app->request->post('access_token');
        $refreshToken = Yii::$app->request->post('refresh_token');
    
        // Convert to jwt token model
        $jwtAccessToken  = \Yii::$app->apiTokens->getJwtToken($accessToken);
        $jwtRefreshToken = \Yii::$app->apiTokens->getJwtToken($refreshToken);
    
        // Renew
        $newTokens = \Yii::$app->apiTokens->renewJwtToken($jwtAccessToken, $jwtRefreshToken);
        
        \Kakadu\Yii2JwtAuth\JwtBearerAuth::addJwtToHeader(\Yii::$app->response, $newTokens);
    }
}

或使用续期令牌操作

use Kakadu\Yii2JwtAuth\RefreshTokensAction;

class AuthController extends yii\rest\Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors(): array
    {
        return ArrayHelper::merge(parent::behaviors(), [
            'authenticator' => [
                'class'  => JwtBearerAuth::class,
                'except' => ['renew-token'],
            ],
            'access'        => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'allow'   => true,
                        'actions' => ['renew-token'],
                        'roles'   => ['?'],
                    ],
                ],
            ],
        ];
    }
            
    /**
     * @inheritdoc
     */
    public function actions(): array
    {
        return ArrayHelper::merge(parent::actions(), [
            'renew-token' => RefreshTokensAction::class,
        ]);
    }
}

最后,将 Jwt Auth 添加到受保护控制器

class SecureController extends yii\rest\Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors(): array
    {
        return ArrayHelper::merge(parent::behaviors(), [
            'authenticator' => [
                'class' => \Kakadu\Yii2JwtAuth\JwtBearerAuth::class,
            ],
            'access'        => [
                'class' => AccessControl::class,
                'rules' => [
                   ...
                ],
            ],
        ]);
    }
}

流程

  • seamlessLogin 为 false

    1. 注册,获取访问和刷新令牌,并将它们保存在客户端。
    2. 仅使用访问令牌向安全端点请求。
    3. 访问令牌过期后,您将收到 401 未授权异常。
    4. 使用过期的访问令牌和不过期的刷新令牌来获取新令牌。 (/refresh-token URL)
    5. 如果刷新令牌过期,则转到登录
  • seamlessLogin 为 true

    1. 注册,获取访问和刷新令牌,并将它们保存在客户端。
    2. 仅使用访问令牌向安全端点请求。
    3. 访问令牌过期后,您将收到 401 未授权异常。
    4. 重复请求使用过期的访问令牌和不过期的刷新令牌来获取新令牌。 (/相同URL)
    5. 如果刷新令牌过期,则转到登录。

这就是全部。检查一下。