CakePHP|CakePHP 3 auth Token令牌实现

【CakePHP|CakePHP 3 auth Token令牌实现】在开发api接口的时候,不可避免会碰到登录验证,本文介绍如何安装与使用 cakephp-jwt-auth 实现CakePHP3 Auth组件的 Token 验证。
介绍 cakephp-jwt-auth 插件是 实现 JSON Web Tokens 的 CakePHP 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; }

    推荐阅读