PHP中ThinkPhp框架的token怎么使用
一、token在ThinkPhp框架的使用
1. 首先在数据库的 users 表中添加两个字段token、time_out
token 用于存储用户的 token
time_out 用于设置用户 token 的过期时间
2.创建函数
checkToekn($token)函数用于检验 token 是否存在, 并且更新 token。
public function checkToken($token){
$user = new \app\index\model\Users();
$res = $user->
field('
time_out'
)->
where('
token'
, $token)->
select();
if (!empty($res)) {
//dump(time() - $res[0]['
time_out'
]);
if (time() - $res[0]['
time_out'
] >
0) {
return 90003;
//token长时间未使用而过期,需重新登陆
}
$new_time_out = time() + 604800;
//604800是七天
$res = $user->
isUpdate(true)
->
where('
token'
, $token)
->
update(['
time_out'
=>
$new_time_out]);
if ($res) {
return 90001;
//token验证成功,time_out刷新成功,可以获取接口信息
}
}
return 90002;
//token错误验证失败
}
3.创建函数
douserLogin($username,$password)用于验证用户名密码, 并登陆, 返回 token 信息。
public function douserLogin(){
$user = new \app\index\model\Users();
$userisset = $user->
where('
username'
, $username)->
find();
if ($userisset == null) {
return json_decode('
{"
user"
:"
'
. $username . '
"
,"
code"
:"
400"
,"
msg"
:"
用户不存在"
}'
);
} else {
$userpsisset = $user
->
where('
username'
, $username)
->
where('
password'
, sha1(md5($password)))->
find();
if ($userpsisset == null) {
return json_decode('
{"
user"
:"
'
. $username . '
"
,"
code"
:"
401"
,"
msg"
:"
密码错误"
}'
);
} else {
//session('
user'
, $username);
$token = $this->
makeToken();
$time_out = strtotime("
+7 days"
);
$userinfo = ['
time_out'
=>
$new_time_out,
'
token'
=>
$token];
$res = $user->
isUpdate(true)
->
where('
username'
, $username)
->
update($userinfo);
if ($res) {
return json_decode('
{"
user"
:"
'
. $username . '
"
,"
toekn"
:'
.$token.'
"
code"
:"
0"
,"
msg"
:"
登录成功"
}'
);
}
}
}
}
二、Token的概念
token是客户端频繁向服务器端请求数据,服务器频繁的去数据库查询用户名和密码判断用户名和密码正确与否,并作出相应的提示,在这样的背景下,token便应运而生了。
随着互联网技术的快速发展,网站和应用程序迅速增多,但带来的危害也越来越严重,其中最常见的就是安全问题。为此,开发者们不断研究出各种安全措施,其中Token机制成为了众多开发者常用的一种方法。本文将详细介绍ThinkPHP框架中的Token机制,帮助读者正确使用和理解它。
一、Token是什么?
Token,意为“令牌”,是指用户访问系统时,从系统返回的随机字符串。在后续的操作中,需要将Token值不断携带在请求参数中,以作为请求合法性的认证标识。如果Token值匹配上,则说明请求来自系统,具有合法性。
二、如何使用Token?
1. 获取Token
在ThinkPHP框架中,Token的获取十分简单,只需要调用系统方法token()即可,例如:
```
//获取Token
$token = token();
```
该方法会返回一个Token随机字符串,存储在Session中。也可以将Token值反馈给前端,方便后续请求时携带。
2. 服务器端Token校验
为了保证请求的合法性,服务器需要对Token进行校验,检查传入的Token值是否与Session中存储的一致。ThinkPHP提供了Token验证器类\\think\\ValidateToken,可以轻松实现Token校验。例如:
```
//获取请求参数及Token
$data = $request->param();
$token = $data['token'];
//实例化验证器
$validate = new \\think\\ValidateToken();
//开始校验Token
if(!$validate->checkToken($token)){
//Token校验失败
return '请求不合法!';
}
```
以上代码在获取请求参数及Token后,实例化\\think\\ValidateToken验证器类,并调用其中的checkToken方法,进行Token匹配。匹配成功则返回true,反之则返回false。
3. 前端Token校验
除了服务器端Token校验外,前端也需要进行Token的校验,检查传入的Token值是否与服务器的一致。开发者可以选择自行编写校验代码,或者使用现成的组件,比如jQuery-validation等。下面是一个简单的示例:
```
//获取Token
var token = '{{session('token')}}';
//前端验证
$('form').validate({
rules: {
token: {
required: true,
equalTo: token
}
}
});
```
以上代码中,前端首先获取服务器存储的Token值,然后使用jQuery-validation进行校验。其中,required规则表示Token不为空,equalTo规则表示Token值与服务器存储的一致。
三、常见问题
1. 是否可以重复使用一个Token?
Token一般情况下只允许使用一次,在被验证后就立即失效。因此,每次请求都需要重新获取Token。
2. 是否需要Token过期时间?
Token过期时间是根据具体需求而定的,一般设置为10~30分钟之间比较合理。过期时间过长会影响系统的安全性,过期时间过短会增加用户体验的成本。
本文介绍了ThinkPHP框架中的Token机制,并详细介绍了如何使用Token、服务器端Token校验以及前端Token校验等问题。相信通过本文的阅读,读者一定可以掌握正确使用Token的方法。最后要提醒大家的是,Token只是一种基本的安全措施,不能完全替代其他更加严格的安全方案。