kakadu-dev / yii2-jwt-auth
该扩展为 Yii2 提供JWT认证
2.0
2020-01-08 07:39 UTC
Requires
- php: >=7.1
- ext-json: *
- firebase/php-jwt: ^5.0
- yiisoft/yii2: ~2.0.15
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, ], ], ];
secretKey、issuer、audience、audienceSecrets 中所有包含 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
- 注册,获取访问和刷新令牌,并将它们保存在客户端。
- 仅使用访问令牌向安全端点请求。
- 访问令牌过期后,您将收到 401 未授权异常。
- 使用过期的访问令牌和不过期的刷新令牌来获取新令牌。 (/refresh-token URL)
- 如果刷新令牌过期,则转到登录
-
seamlessLogin 为 true
- 注册,获取访问和刷新令牌,并将它们保存在客户端。
- 仅使用访问令牌向安全端点请求。
- 访问令牌过期后,您将收到 401 未授权异常。
- 重复请求使用过期的访问令牌和不过期的刷新令牌来获取新令牌。 (/相同URL)
- 如果刷新令牌过期,则转到登录。
这就是全部。检查一下。