admad/cakephp-jwt-auth

CakePHP插件,用于使用JSON Web Tokens进行身份验证

安装次数: 568,217

依赖: 14

建议: 1

安全: 0

星标: 164

关注者: 19

分支: 43

开放问题: 0

类型:cakephp-plugin

3.0.0 2021-02-21 08:56 UTC

This package is auto-updated.

Last update: 2024-09-21 09:25:22 UTC


README

Build Status Coverage Status Total Downloads License

插件包含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' => '',
        ]);
    }

工作原理

身份验证类在两个位置检查令牌

  • HTTP_AUTHORIZATION环境变量

    它首先检查是否通过Authorization请求头传递了令牌。值应为Bearer <token>形式。可以使用选项headerprefix分别自定义Authorization头名称和令牌前缀。

  • 使用parameter配置指定的查询字符串变量

    接下来,它检查令牌是否存在于查询字符串中。默认变量名称为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

令牌生成

您可以使用此插件所依赖的firebase/php-jwt库中的\Firebase\JWT\JWT::encode()来生成令牌。

负载必须包含“sub”(主题)声明,其值用于查询Users模型并找到匹配“id”字段的记录。

理想情况下,您还应该使用exp声明指定令牌过期时间。

可以将queryDatasource选项设置为false,以直接将令牌的有效负载作为用户信息返回,而无需查询数据源以匹配用户记录。

进一步阅读

有关端到端使用示例,请参阅Bravo Kernel的这篇博客文章