token验证

这篇具有很好参考价值的文章主要介绍了token验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

token验证

什么是token?我相信很多开发者都或多或少听过基于 token 的用户鉴权和基于 session 的用户鉴权,而今天说的 token 验证就是第一种了。token 的意思是“令牌”,是用户第一次登录服务器返回的,它能让用户不需要提交账户和密码就能进行服务器验证身份,它是被放在请求头中一起提交给服务器的。

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

首先是为什么用?

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

那么怎么用呢?

流程:

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

token的组成

一般 token 组成:

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

JWT 组成:

JWT(JSON Web Tokens) 读:jot

标准的组成:

  1. header(头部),参数主要包括:类型--JWT,签名的算法--HS256。
private static $header=array(
        'alg'=>'HS256', //生成signature的算法
        'typ'=>'JWT'    //类型
);
  1. poyload(负荷):一般是自己想要放置的数据(因为信息会暴露,不建议放敏感信息)。
    token验证
$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验证时,应该注意一些安全性问题。例如:

  • 如何防止Token被盗用:可以使用HTTPS来保护通信安全,防止Token在传输过程中被窃听。此外,可以定期刷新Token,使得被盗用的Token尽快失效。
  • 如何防止重放攻击:可以在Token中添加时间戳和随机数,服务器根据时间戳和随机数来判断Token是否有效。此外,可以使用一次性Token,即每次使用后都需要刷新。

总结

我们也可以在移动端使用,例如用Vue + express:

  1. 首先在 express 中安装 jsonwebtoken
npm install jsonwebtoken -S
  1. 生成 token 值并返回给前端:
    在 login 接口中加入
const token = jwt.sign({ info }, SECRET_KEY, { expiresIn: '24h' }); // SECRET_KEY 可以是自己定义的一个密钥,也可以是使用 crypto 包随机生成或者其他密钥
  1. 可以定义在全局然后使用白名单去除不需要验证的接口;这里定义一个验证 token 的中间件,需要使用 token 验证才能获取数据的接口才放上这个中间件:
const verifyToken = (req, res, next) => {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];
    if (!token) {
        return res.status(401).json({ message: 'Missing token' });
    }
    try {
        jwt.verify(token, SECRET_KEY);
        console.log(jwt.verify(token, SECRET_KEY))
        next();
    } catch (error) {
        res.status(401).json({ message: 'Invalid token' });
    }
};
  1. 在前端登录成功后把返回的 token 值存储在 localStorage,至于存储在 localStorage 跟其他地方的区别可以看我八股文那篇文章中的浏览器部分:
localStorage.setItem('token', res.data.token);
  1. 可以使用拦截器把获取到的 token 值放在每次请求头中,Vue 是在 main.js 中配置,这里使用 axios 来发起请求,所以使用 axios 配置:
axios.interceptors.request.use(config => {
    // 获取localStorage中的token
    const token = localStorage.getItem('token');
    // 如果有token,则在请求头中添加Authorization字段
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    }

    return config;
});
  1. 也可以在使用路由守卫判断是否已登录,在router/index.js中进行配置:
router.beforeEach((to, from, next) => {
  // 检查localStorage中是否有token
  const token = localStorage.getItem('token');

  // 如果要访问的路由需要登录,但用户未登录,则重定向到登录页面
  if (to.matched.some(record => record.meta.requiresAuth) && !token) {
    next('/');
  } else {
    next();
  }
});

前端如何处理Token过期

当服务器返回401错误时,表示Token已经过期。此时,客户端可以采取以下措施之一来处理Token过期的问题:

  • 自动刷新Token:客户端可以调用刷新Token的接口来获取新的Token。此时,客户端需要保存刷新Token,并在调用刷新Token接口时携带刷新Token。
  • 重定向到登录页面:客户端可以提示用户重新登录,并重定向到登录页面。用户重新登录后,客户端会获取新的Token。

Vue 项目进行 token 验证的基本使用就是这些了。

扩展

放请求头:token验证

JWT 缺点:1.签发生成后无法修改。2.不包含权限控制。

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

解决token 续签问题:后端在用户登录的接口添加 token 有效期判断:例如即将过期那就重新生成一个返回。

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

关于 token 更多的问题请在评论区留言!!!

参考文献

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

创作不易,若需转载请备注出处!文章来源地址https://www.toymoban.com/news/detail-413230.html

到了这里,关于token验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序逆向 小程序包使用unveilr工具解包后在开发者工具报[ WXML 文件编译错误] xxx.wxs Unexpected token `}`

    微信小程序逆向 使用解包工具后后在开发者工具报[ WXML 文件编译错误] xxx.wxs Unexpected token } 页面上则报编译.wxml文件错误… 解决方案: 很简单,因为是解包出来的,一般代码都是没有错的,我们只需要微信微信开发者工具中的资源管理器或者其他地方,找到这个文件,然后

    2024年02月08日
    浏览(60)
  • 开发者,你知道IaaS,PaaS,SaaS是什么吗?

    👨‍💻作者:大二计算机学生小周 🏠主页:关注小周 📌关键: IaaS PaaS SaaS 🔗友链:了解云计算的概念 本文将学习 IaaS, PaaS, SaaS 到底是什么,让你理解这些热词。 🪄 友情提示: 如果你对云计算的概念不清晰的话,建议你去文章开始处的链接,先了解云计算的概念,再读

    2024年02月03日
    浏览(77)
  • 掘金AIGC时代,开发者更需要什么样的大模型?

      当前,火热的AI大模型领域需要一些冷思考。 自去年年底ChatGPT掀起一轮AIGC热潮以来,国内科技企业扎堆发布大模型和类ChatGPT产品。截止2023年4月,已公开宣布发布或即将发布AI大模型的企业达数十家。多模态大模型的能力不断迭代,市场竞争加剧,同时监管意见及时出台,

    2024年02月09日
    浏览(50)
  • 为什么超 80% 的开源开发者苦苦挣扎在贫困线?

    【CSDN 编者按】开源开发者究竟该如何生存?这是一个业界为之困扰许久的问题。如果开发者只从事开源项目工作、且没有其他收入来源的话,那么开源项目的捐赠就是他们的工资。事实证明,超过80%我们以为具有可持续性的项目实际收入都低于行业标准,甚至苦苦挣扎于贫

    2024年02月08日
    浏览(54)
  • 为什么超过500万开发者选择了ASP.NET Core?

    ASP.NET Core 是一个新的开源和跨平台的框架,用于构建如 Web 应用、物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。 ASP.NET Core 应用可运行于 .NET Core 和完整的 .NET Framework 之上。构建它的目的是为那些部署在云端或者内部运行(on-premises)的应用提供

    2024年02月04日
    浏览(51)
  • 为什么开发者关系对 Web3 的成功至关重要?

    之前,我们研究了早期初创公司如何建立开发者社区和跟踪产品与市场的契合度。如果没有有效的开发者关系团队,这些举措不太可能成功。 开发者关系专业人员通常作为信息枢纽,经常与产品、销售和营销等其他运营团队合作,并让每个人都了解情况。由于许多Web3初创公

    2023年04月08日
    浏览(57)
  • 为什么聚合云厂商的vps可以降低谷歌开发者账号关联风险?

    谷歌上架马甲包需要多个不同的开发者账号,而谷歌又不允许一个开发者拥有多个账号。 因此,谷歌会通过多种方法分析判断是否存在账号关联或滥用,但具体算法或方法并没有公开。根据经验,IP是一个重要因素。 先了解一下谷歌及其它平台是如何根据IP地址来判断账号关

    2024年02月07日
    浏览(51)
  • 为什么越来越多的开发者放弃使用Postman,而选择Apifox

    1、Postman + Swagger + Mock + JMeter 作为一个后端开发,我做的大部分项目一般都是基于 Swagger 来管理 API 文档,基于 Postman 来做接口调试,基于 JMeter 来做接口性能测试,基于 RAP 等工具 Mock API 数据。 2、存在的问题 (1)多系统数据不互通 API设计者、前端开发、后端开发、测试人

    2024年01月20日
    浏览(54)
  • 开发者工具network里请求pending状态耗时长是为什么?(项目部分页面的请求)

    前言:本文主要是提问,后文有一个解决办法,但仅供参考 目录 问题 排查过程 解决办法(仅供参考) 提问:         在开发一个数字化大屏项目的时候遇到问题:某个大屏接口请求10多秒才能拿到响应数据,其他大屏页面接口响应很快。         发现主要是接口statu

    2023年04月08日
    浏览(76)
  • 如何成为一名高效的前端开发者(10X开发者)

    如今,每个人都想成为我们所说的“10倍开发者”。然而,这个术语经常被误解和高估。 本质上,一个高效或者10倍开发者,在我看来,是指那些能够充分利用所有可用工具的人,通过让这些工具处理冗余和重复的任务,使他们能够专注于复杂和创造性的工作。以下是一些成

    2024年02月05日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包