admad / cakephp-jwt-auth
CakePHP插件,用于通过JSON Web Tokens进行身份验证
Requires
- cakephp/cakephp: ^4.0
- firebase/php-jwt: ^5.0
Requires (Dev)
- phpunit/phpunit: ~8.5.0
README
包含AuthComponent的authenticate类用于通过JSON Web Tokens进行身份验证的插件。您可以在这里详细了解JSON Web Token规范。
安装
composer require admad/cakephp-jwt-auth
使用方法
使用Cake的命令行加载插件
./bin/cake plugin load ADmad/JwtAuth
配置
设置AuthComponent
// In your controller, for e.g. src/Api/AppController.php public function initialize(): void { parent::initialize(); $this->loadComponent('Auth', [ 'storage' => 'Memory', 'authenticate' => [ 'ADmad/JwtAuth.Jwt' => [ 'userModel' => 'Users', 'fields' => [ 'username' => 'id' ], 'parameter' => 'token', // Boolean indicating whether the "sub" claim of JWT payload // should be used to query the Users model and get user info. // If set to `false` JWT's payload is directly returned. 'queryDatasource' => true, ] ], 'unauthorizedRedirect' => false, 'checkAuthIn' => 'Controller.initialize', // If you don't have a login action in your application, set // 'loginAction' to empty string to prevent getting a MissingRouteException. 'loginAction' => '', ]); }
工作原理
身份验证类检查token位于两个位置
-
HTTP_AUTHORIZATION
环境变量它首先检查是否通过
Authorization
请求头传递了token。其值应该是Bearer <token>
的形式。Authorization
头名称和token前缀Bearer
可以通过选项header
和prefix
分别自定义。 -
使用
parameter
配置指定的查询字符串变量接下来,它检查token是否存在于查询字符串中。默认变量名称是
token
,可以通过上述parameter
配置进行自定义。
已知问题
某些服务器在设置Authorization
头时不会填充$_SERVER['HTTP_AUTHORIZATION']
。因此,您需要确保设置$_SERVER['HTTP_AUTHORIZATION']
或$_ENV['HTTP_AUTHORIZATION']
。
例如,对于apache,您可以使用以下方法
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
或
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Token生成
您可以使用此插件依赖的firebase/php-jwt库中的\Firebase\JWT\JWT::encode()
来生成token。
负载必须包含“sub”(主题)声明,其值用于查询Users模型并找到匹配“id”字段的记录。
理想情况下,您还应该使用“exp”(过期时间)声明指定token的过期时间。
您可以将queryDatasource
选项设置为false
,以直接将token的有效负载作为用户信息返回,而无需查询数据源以匹配用户记录。
进一步阅读
有关端到端使用示例,请参阅Bravo Kernel的这篇博客文章此。