在开发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后保存,每次请求添加authorization
或token
请求参数即可通过验证。
header参数示例,需要在token前添加bearer[空格]
authorization: bearer token
其他
- 由于
Token
令牌本身已储存了认证信息,Token
泄露后会产生很多安全问题,所以在安全性有一定要求的应用中,过期时间应设置较小,且尽量使用Https协议传输,或者在服务器端再添加相关验证逻辑 -
Token
本身为无状态令牌,当用户权限修改后且Token
未失效,会出现权限不匹配问题,此类情况需要在服务端添加验证逻辑
总结
在提倡前后端分离的今天,类似Token
的身份验证方式将会越来越多。Token
本身并不复杂,上述部分仅仅是JWT
在CakePHP
中的插件,对于其他框架或程序,我们也可以利用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;
}
网友评论