token是客户端和服务端交流的一种方式,原理是服务端生成token后给客户端,客户端携带token进行通讯。
服务端的责任第一是给新请求生成新的token,第二是验证客户端携带的token的可用性。
token可用保存在数据库中、session中、也可以存在cookie中,当然内存数据库也非常方便。
这里服务端生成token后交给客户端即可,客户端进行存储,每次请求时带上token,后端进行解密判断信息和有效期等。
//用户登录
protected function LoginAction()
{
//省略其他不相干代码
$expire = time() + 3600 * 12;//12h过期
$token = base64_encode('app'.'|'.$data['userid'].'|'.$expire.'|'.md5('app'.$data['userid'].$expire.'aaaabbbb'));
return array('code'=>0,'msg'=>'登录成功','token'=>$token);
}
//接口认证
public function ApiAuthToken()
{
$info = self::decodeToken($_POST['token']);
if (!$info)
{
return array('code'=>1000000,'error_msg'=>'token错误或非法');
}
if ($info['expire'] < time())
{
return array('code'=>1000000,'err_msg'=>'token已过期');
}
if ($info['auth_secret'] <> md5($info['client'].$info['userid'].$info['expire'].'aaaabbbb'))
{
return array('code'=>1000000,'err_msg'=>'token非法');
}
//todo ......
}
//获取真实用户信息
private function decodeToken($token)
{
$array=explode('|',base64_decode($token));
if (!empty($array[0]) && is_numeric($array[1]) && !empty($array[2]) && !empty($array[3]) )
{
return array('client'=>$array[0],'userid'=>$array[1],'expire'=>$array[2],'auth_secret'=>$array[3]);
}
return array();
}