释意
token是一种特殊的字段
主要作用就是验证身份,可以理解为一种身份证
可以靠这个进入有要求的页面
可以给用户生成
必须是独一无二难以破解
设计思路
放再公共的文件内,通过初始函数调用的方式验证token就可以对全部的请求要求验证token,为了唯一性可以在其中加入时间戳,盐值等进行字段加密。
代码实现
生成token
可以选择在用户登陆的时候生成,然后保存在session中
首先用户登陆,然后后台自动创建一个token值保存给数据库
基础登陆
public function login()
{
//测试账号:AccountNumber jack password myjack
session_start();//开启session保存
$webData = new WebData();//实例化
//拿到数据,保存
isset($_POST['AccountNumber']) ? $AccountNumber = $_POST['AccountNumber'] : '';
isset($_POST['password']) ? $password = $_POST['password'] : '';
//验证数据,不为空,数据字段长度,
//应该使用Validate验证数据字段
//数据库匹配账号密码
$data = db::name('user')->where('account', $AccountNumber)->find();
if ($data != null) {
$is_true = password_verify($password, $data['password']);//判断密码是否和散列值匹配,密码在这里的传递过程中需要进行加密
if ($is_true) {
$msg['code'] = 200;
$msg['msg'] = '登陆成功';
$id = $data['id'];
$_SESSION['id'] = $id;//用户名已经保存在数据库内
//生成token,生成规则
$token = openssl_encrypt($id, 'AES-128-ECB', 245184);
//openssl_encrypt($data(加密明文), $method(加密方法), $password(加密秘钥), $options(数据格式选项(可选)), $iv(密初始化向量(可选)))
//将token存入数据库内
$data['token'] = $token;
} else {
$msg['code'] = 400;
$msg['msg'] = '密码错误';
}
print_r($msg);
}
}
第二种token存储方法
public function login()
{
$this->all_header();
if ($_SERVER['REQUEST_METHOD'] != 'OPTIONS') {
isset($_POST['AccountNumber']) ? $AccountNumber = $_POST['AccountNumber'] : '';
isset($_POST['password']) ? $password = $_POST['password'] : '';
$data = db::name($this->tableName)->where('account', $AccountNumber)->find();
if ($data != null) {
$is_true = password_verify($password, $data['password']);
if ($is_true) {
$userData['userID'] = password_hash($data['id'], PASSWORD_DEFAULT);
$userData['nickName'] = $data['nickname'];
$userData['legal_person'] = $data['legal_person'];
$userData['head_img'] = $data['head_img'];
$userData['token'] = $this->createToken($data['id'],$userData['userID']);
return json_encode($userData);
} else {
$data = ['msg' => '用户名或密码错误'];
return json_encode($data);
}
} else {
$data = ['msg' => '账号不存在'];
return json_encode($data);
}
}
}
写在公共文件夹下的创建token
//创建token
public function createToken($id,$ID){
$webData = new WebData();
$status = $_SERVER['REQUEST_METHOD'];
if($status!='OPTIONS'){
$token = openssl_encrypt($ID, $this->encryptionType, $this->secretKey);
$thisToken = db::name('user_token')->where('pid', $id)->find();
$time = date('Y-m-d H:i:s',time());
$tokenDay = $this->tokenDay;
if ($thisToken == null) {
$insertToken['value'] = $token;
$insertToken['pid'] = $id;
$insertToken['update_time'] = $time;
$insertToken['expiration_time'] = date('Y-m-d H-i-s', strtotime("+10 seconds"));
db::name($this->tokenTable)->insert($insertToken);
return $token;
} else {
$update['value'] = $token;
$update['pid'] = $id;
$update['update_time'] = $time;
$update['expiration_time'] = date('Y-m-d H-i-s', strtotime("+10 seconds"));
db::name($this->tokenTable)->where('pid',$id)->update($update);
return $token;
}
}
}
验证token
//定义token的属性文件
public $tokenDay = 3;//token有效天数
public $data = 'http://vytxx.cn';//域名,主要用在拼接文件
public $encryptionType = 'AES-128-ECB';//token加密类型
public $secretKey = '245184';//token秘钥
public $tokenTable = 'user_token';
//判断token返回代码
public function is_token(){
$webData = new WebData();
$status = $_SERVER['REQUEST_METHOD'];
if($status!='OPTIONS'){
$token = $_SERVER['HTTP_TOKEN'];
$is_token = $webData->is_token($token);
if ($is_token==1){
return 1;
}else{
return json_encode($webData->getTokenError($token));
}
}
}
//验证token返回代码
//返回token错误代码
public function getTokenError($token)
{
$code = $this->is_token($token);
if ($code == 2) {
$data['code'] = 401;
$data['token']=$_SERVER['HTTP_TOKEN'];
$data['msg'] = 'token过期';
} elseif ($code == 3) {
$data['code'] = 401;
$data['msg'] = 'token不存在';
}
return $data;
}
写在公共文件类里面