客户端token生成和验证

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();
    }

评论/留言