美文网首页
CakePHP 3 auth Token令牌实现

CakePHP 3 auth Token令牌实现

作者: jzaaa | 来源:发表于2019-01-14 14:18 被阅读0次

    在开发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令牌实现

          本文链接:https://www.haomeiwen.com/subject/xmrddqtx.html