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-11-23
- laravel通用化的CURD的实现 2023-03-17
- PHP简单实现二维数组的矩阵转置操作示例 2022-10-02
- Laravel balde模板文件中判断数据为空方法 2023-08-30
- PHP实现微信支付(jsapi支付)流程步骤详解 2022-10-09
- 用nohup命令实现PHP的多进程 2023-09-02
- PHP中PDO事务处理操作示例 2022-10-15
- PHP仿tp实现mvc框架基本设计思路与实现方法分析 2022-10-18
- windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境) 2023-09-02
- laravel实现按月或天或小时统计mysql数据的方法 2023-02-22
