CakePHP 3 auth Token令牌实现

在开发api接口的时候,不可避免会碰到登录验证,本文介绍如何安装与使用 cakephp-jwt-auth 实现CakePHP3 Auth组件的 Token 验证。

介绍

cakephp-jwt-auth 插件是 实现 JSON Web TokensCakePHP 3 Auth组件拓展插件。

安装

composer require admad/cakephp-jwt-auth

加载插件

$ bin/cake plugin load ADmad/JwtAuth

配置插件

 // In your controller, for e.g. src/Api/AppController.php
    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('Auth', [
            'storage' => 'Memory',
            'authenticate' => [
                 // auth组件配置参数,请务必添加此参数,否则auth组件验证不生效
                 'Form' => [
                ],
                'ADmad/JwtAuth.Jwt' => [
                    'userModel' => 'Users',
                    'fields' => [
                        'username' => 'id'
                    ],

                    // get 参数名
                    'parameter' => 'token',

                    // 如果设置为true,则每次查询数据库返回用户数据,否则返回token解析数据
                    'queryDatasource' => false
                ]
            ],

            'unauthorizedRedirect' => false,
            'checkAuthIn' => 'Controller.initialize'
        ]);
    }

使用

// In your controller, for e.g. src/Api/UsersController.php
    public function initialize()
    {
        parent::initialize();

        $this->Auth->allow(['login']);

    }

// 登录
    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            
            $token = null;

            if ($user) {
              // 其他配置请查看JWT官方手册
                $token = JWT::encode([
                    'sub' => $user['id'],
                    'exp' =>  time() + 604800 // 过期时间
                ], Security::getSalt());

            }
            
            // output your token
        }
    }

前端获取token后保存,每次请求添加authorizationtoken请求参数即可通过验证。

header参数示例,需要在token前添加bearer[空格]

authorization: bearer token

其他

  • 由于Token令牌本身已储存了认证信息,Token泄露后会产生很多安全问题,所以在安全性有一定要求的应用中,过期时间应设置较小,且尽量使用Https协议传输,或者在服务器端再添加相关验证逻辑
  • Token本身为无状态令牌,当用户权限修改后且Token未失效,会出现权限不匹配问题,此类情况需要在服务端添加验证逻辑

总结

在提倡前后端分离的今天,类似Token的身份验证方式将会越来越多。Token本身并不复杂,上述部分仅仅是JWTCakePHP中的插件,对于其他框架或程序,我们也可以利用JWT来生成自己的Token

composer require firebase/php-jwt
// set token
$token = JWT::encode([
     // 你的数据
     'sub' => ‘主题’,
     'exp' =>  time() + 604800,
      ...
], '你的密钥', 'HS256');

// decode token - token解析
try {
    $payload = JWT::decode(
        $token, // token值
        '你的密钥',
        'HS256' // 对应加密方式
    );
    return $payload;
} catch (Exception $e) {
    throw $e;
}

你可能感兴趣的:(CakePHP 3 auth Token令牌实现)