token和session的区别:token和session其实都是为了身份验证,session一般翻译为会话,而token更多的时候是翻译为令牌;session在服务器端会保存一份,可能保存到缓存、文件或数据库;session和token都是有过期时间一
token和session的区别:
token和session其实都是为了身份验证,session一般翻译为会话,而token更多的时候是翻译为令牌;session在服务器端会保存一份,可能保存到缓存、文件或数据库;session和token都是有过期时间一说,都需要去管理过期时间;token的思想是算法验证,session的思想是信息存储对比。 token是有多种方案的,可以设计成无需存储,token同时也是跨域的,session是要存储的,存储在数据库的思想;其实token与session的问题是一种时间与空间的博弈问题,session是空间换时间,而tbken是时
间换空间。虽然确实都是“客户端记录,每次访问携带”,但 token 很容易设计为自包含的,也就是说,后端不需要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法 /非法的结论。
以下是一个简单的生成token方法,也可以使用插件去生成,比如jwt扩展插件,这里为了简单就直接不用插件了。
一、首先创建用户表:包含token和token过期时间,登录时间
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`realname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`status` tinyint(2) DEFAULT '0',
`created_at` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`updated_at` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`login_time` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`token` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`time_out` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
二、使用PHP编写登录方法:这里使用的ThinkPHP6的写法,原生原理也是一样的。
<?php
public function login(){
$phone = input('phone');
$password = input('password');
if(empty($phone) || empty($password)){
return json(['code'=>500,'msg'=>'error','data'=>'参数错误']);
}
$res = Db::name("user")->where(array('phone'=>$phone))->find();
if($res){
if($res['password'] == md5($password)){
$token = sha1( md5(uniqid(md5((string)microtime(true)),true))); //生成一个不会重复的token
$time_out = time()+3600; //1小时过期事件
$data = [
"token"=>$token,
"time_out"=>$time_out,
"login_time"=>time()
];
$update = Db::name("user")->where(array('phone'=>$phone))->update($data);
if($update){
$resToken = Db::name("user")->where(array('phone'=>$phone))->find();
if($resToken){
return json(['code'=>200,'msg'=>'success','data'=>$resToken['token']]);
}else{
return json(['code'=>500,'msg'=>'error','data'=>'登录失败']);
}
}else{
return json(['code'=>500,'msg'=>'error','data'=>'登录失败']);
}
}else{
return json(['code'=>500,'msg'=>'error','data'=>"账号或密码错误"]);
}
}else{
return json(['code'=>500,'msg'=>'error','data'=>'账号不存在']);
}
}
?>
说明:这里生成一个不重复的token,以及一小时就过期的时间,用户每次登录的时候都刷新token,并更新到数据库
<?php
$token = sha1( md5(uniqid(md5((string)microtime(true)),true))); //生成一个不会重复的token
$time_out = time()+3600; //1小时过期事件
?>
三、验证token是否过期:这里使用的ThinkPHP6的写法,原生原理也是一样的。
<?php
public function checklogin(){
$token = input('token');
if($token){
$res = Db::name("user")->where(array('token'=>$token))->find();
if($res){
if(time() - $res['time_out'] > 0){
return json(['code'=>500,'msg'=>'error','data'=>'登录已过期,请重新登录']);
}else{
return json(['code'=>200,'msg'=>'success','data'=>'登录验证成功']);
}
}else{
return json(['code'=>500,'msg'=>'error','data'=>'请先登录']);
}
}else{
return json(['code'=>500,'msg'=>'error','data'=>'参数错误']);
}
}
?>
说明:前端传递token给后端,后端根据用户传递过来的token去数据表里查询该用户的数据,判断当前时间戳减去登录保存的过期时间,再判断过期时间是大于0,大于0即为token已过去,用户需要重新登录。
本文标题为:PHP生成简单的token登录以及验证token有效时间和刷新token
基础教程推荐
- PHP命名空间简单用法示例 2022-12-01
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- php array分组,PHP中array数组的分组排序 2022-08-01
- 使用PHP开发留言板功能 2023-03-13
- PHP中的错误及其处理机制 2023-06-04
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02