继续请教一下同事关于token 这块设计,token这块可以带时间验证,也可以不带时间验证。在当初接触微信开发的时候,每次接口调用都是有时间凭证。所以在授权方需要这样处理。对于一些安全级别不要求那么高,没有资金需求。一个token 可以降低一下复杂度的设计,不一定需要用到接口过期时间去验证。安全级别高,加上这块还是有必要。
在上次练习中,使用session保存token。而这一次使用数据库,建立一个token表。每次登录后,刷新相应的用户token信息。
token表里面只是记录token,用户uid,exprise_time 过期时间预留字段。
在原有基础上进行修改调整。login.php
<?php
//1.验证接口,接收数据,过滤数据合法性
//2.构建数据库链接
//3.md5 验证数据库用户密码
//4.生成session,返回token,带时长,或者使用数据库插入token,每次用数据库检索
//5.前端localStore 保存token,接口请求发送需要带上验证token匹配
header('Content-Type: application/json');
header('Content-Type: text/html;charset=utf-8');
$userName = $_POST['userName'];
$userPwd = md5($_POST['userPwd']);
$conn = mysql_connect("localhost","root","") or die('Could not connect: ' . mysql_error());
mysql_select_db("test",$conn);
mysql_query("set name utf-8");
//查询结果验证
$sql = "select * from user where name ='$userName' and pwd = '$userPwd'";
$result = mysql_query($sql);
if($data=mysql_fetch_array($result))
{
session_start();//启动session
$_SESSION['name'] = $data['name'];
$_SESSION['uid'] = $data['id'];
//生成token 返回给前端
$token = createToken();
//不带过期时间更新
$sql = "update token set token='$token' where uid = ".$data["id"];
$result = mysql_query($sql);
if($result)
{
output(200,$token,'success');
}
else
{
output(400,'','密码或帐号出错');
}
//返回一个结果
}
else
{
output(400,'','密码或帐号出错');
}
mysql_close($conn);
//生成不重复的token,利用网上一个算法
function createToken()
{
$token = md5(uniqid(md5(microtime(true)),true));
$token = sha1($token);
return $token;
}
function output($code,$token,$msg='')
{
$outputData = array();
$outputData['code'] = $code;
$outputData['token'] = $token;
$outputData['msg'] = $msg;
echo json_encode($outputData);
}
?>
调整过后,Session方式不做处理,改成每次登录对token表进行刷新处理。登录后,每次token都会缓存一份在客户端。
$sql = "update token set token='$token' where uid = ".$data["id"];
$result = mysql_query($sql);