token验证

科技资讯 投稿 5700 0 评论

token验证

token验证

为什么用 token 验证?怎么用 token 验证?现在简单介绍一下,有错误请大牛指出,我会立即更正!

首先是为什么用?

    为了验证用户的登录情况,毕竟不是登录状态的话很多东西是不允许访问和呈现出来的。
  1. 减少数据库的频繁查询,增加服务器性能,使得服务器更加健壮。
  2. 它可以在多个服务间共享,完全由应用管理,可以避开浏览器的同源策略。
  3. 增加扩展性、安全性和减少服务器内存开销。传统的服务器验证是使用 cookie + session 验证,服务器需要每一次都验证客户端的请求去辨别客户端身份,并且还要创建一个记录将用户信息存储起来,然而随着现在科技发达,这种验证弊端也就显露出来了,例如用户增多从而引发内存资源消耗变大、CORS(跨域资源共享和 CSRF(跨域请求伪造等。

那么怎么用呢?

流程:

    客户端的用户输入账户密码请求登录。
  1. 服务端收到请求并进行验证,成功则生成一个 token 值并返回给客户端。
  2. 客户端收到 token 值并将其存储,例如 本地存储:localStore 或 放在Cookie。
  3. 客户端每次请求都将 token 值放在请求头中发给服务器,服务器进行验证有效性。
  4. 成功则返回客户端请求的数据,失败可以让用户进行登录重新获取新的 token 值。

token的组成

一般 token 组成:

    Uid(用户身份的唯一标识
  1. time(时间戳
  2. sign(签名

JWT 组成:

标准的组成:

    header(头部,参数主要包括:类型--JWT,签名的算法--HS256。
private static $header=array(
        'alg'=>'HS256', //生成signature的算法
        'typ'=>'JWT'    //类型
;
  1. poyload(负荷:一般是自己想要放置的数据(因为信息会暴露,不建议放敏感信息。
$time = time(;
$tokenInfo = [
    'iss'=>'CIMS',
    'iat'=>$time,
    'nbf'=>$time+2,
    'jti'=>md5(uniqid('JWT'.$time,
    'sub'=>$data,
    'exp'=> $time+7200
];
  1. sign(签名:为了防止被恶意篡改数据。
    /**
    * HMACSHA256签名 https://jwt.io/ 中HMACSHA256签名实现
    * @param string $input 为base64编码后连接而成的的header和poyload的字符串:base64UrlEncode(header.".".base64UrlEncode(tokenInfo
    * @param string $key
    * @param string $alg 算法方式
    * @return mixed
    */
    private static function signature(string $input, string $key, string $alg = 'HS256'
    {
    $alg_config=array(
    'HS256'=>'sha256'
    ;
    return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true;
    }
结果:一般会使用 base64 编码,中间用.隔开

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm5hbWUiOiJjZXNoaSIsImF1ZCI6IiIsImV4cCI6MTY4MTIyNDY0OCwiaWF0IjoxNjgxMjIxMDQ4LCJpc3MiOiIiLCJqdGkiOiJkN2UxYTBiNGU3MDZmODUxMjgzZWZkZWVlZjQ5MWEwOSIsIm5iZiI6MTY4MTIyMTA0OCwic3ViIjoiIn0.qRTyO1pYHHJxBNRwHUz032NWKKqS3C9dakOHASJyASk

总结

扩展

解决token 注销问题:尽快让 token 失效,退出登录后删除 cookie,对失效的 token 形成黑名单,会违无状态特性,但是标记时间短,会减少服务器压力。

token验证目前是非常流行的,不仅仅只是在web网站上,移动端、小程序也会用到。例如小程序用的是使用 login 获取 code 发送给后端进行一系列使用微信官方API接口获取数据再进行加密等操作才返回 token,这里就不详细展开了吧,有兴趣哈哈哈哈自己查下看看啦。

参考文献

https://blog.csdn.net/MINGJU2020/article/details/103039418
https://blog.csdn.net/HD243608836/article/details/115732104
https://zhuanlan.zhihu.com/p/267771576

创作不易,若需转载请备注出处!

编程笔记 » token验证

赞同 (26) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽