重学Node.js及其框架(Express, Koa, egg.js) 之 token的使用

简介: 重学Node.js及其框架(Express, Koa, egg.js) 之 token的使用

总结自 Coderwhy的nodejs课程


查看jwt机制 jwt.io/


认识token


cookie和session的方式有很多的缺点:


  • Cookie会被附加在每个HTTP请求中,所以无形中增加了流量(事实上某些请求是不需要的);


  • Cookie是明文传递的,所以存在安全性的问题;


  • Cookie的大小限制是4KB,对于复杂的需求来说是不够的;


  • 对于浏览器外的其他客户端(比如iOS、Android),必须手动的设置cookie和session;


  • 对于分布式系统和服务器集群中如何可以保证其他系统也可以正确的解析session?

所以,在目前的前后端分离的开发过程中,使用token来进行身份验证的是最多的情况:


  • token可以翻译为令牌;


  • 也就是在验证了用户账号和密码正确的情况,给用户颁发一个令牌;这个令牌作为后续用户访问一些接口或者资源的凭证;


  • 我们可以根据这个凭证来判断用户是否有权限来访问;

所以token的使用应该分成两个重要的步骤:


  • 生成token:登录的时候,颁发token;


  • 验证token:访问某些资源或者接口时,验证token;


通过jwt来实现token


JWT生成的Token由三部分组成:


  • header


  • alg:采用的加密算法,默认是 HMAC SHA256(HS256),采用同一个密钥进行加密和解密;


  • typ:JWT,固定值,通常都写成JWT即可;会通过base64Url算法进行编码


  • payload


  • 携带的数据,比如我们可以将用户的id和name放到payload中;


  • 默认也会携带iat(issued at),令牌的签发时间;


  • 我们也可以设置过期时间:exp(expiration time);


  • 会通过base64Url算法进行编码


  • signature


  • 设置一个secretKey,通过将前两个的结果合并后进行HMACSHA256(默认编码)的算法;


  • HMACSHA256(base64Url(header)+.+base64Url(payload), secretKey);


  • 如果secretKey暴露是一件非常危险的事情,因为之后就可以模拟颁发token,也可以解密token;注意:前两个字段是通过base64编码的,可以反向解码。但是最后一个字段一般不行。


网络异常,图片无法展示
|


token生成的加密方式


对称加密


显而易见,就是对token加密和解密都使用同一个秘钥。即HS256加密算法


非对称加密


我们对于token的加密和解密使用两个秘钥


  • 私钥(private key):用于发布令牌


  • 公钥(public key):用于验证令牌; 如何来生成公钥和私钥呢?


  • mac电脑直接在终端执行下面命令即可。


  • windows电脑,需要在git bash中执行下面命令。


openssl
    genrsa -out private.key 1024
    rsa -in private.key -pubout -out public.key


在开发中使用token


在真实开发中,我们可以直接使用一个库来完成: jsonwebtoken;


const jwt = require("jsonwebtoken");
    async login (ctx, next) {
        // 登陆成功后取出user
        const { id, username } = ctx.user;
        // 生成token。通过私钥生成token
        const token = jwt.sign({ id, username }, PRIVATE_KEY, {
          // 设置过期时间
          expiresIn: 60 * 60 * 24,
          // 设置编码格式
          algorithm: 'RS256'
        })
        ctx.body = {
          id,
          username,
          token
        }
      }


解析token


// 验证授权,解密
    async function verifyAuth (ctx, next) {
      const authorization = ctx.request.headers.authorization;
      const token = authorization && authorization.replace("Bearer ", "");
        // 通过公钥解析token
        const user = jwt.verify(token, PUBLIC_KEY, {
          algorithms: ["RS256"]
        })
        // 保存user数据,以后有用
        ctx.user = user
        await next()
    }


相关文章
|
7月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
534 1
|
12月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
1188 9
|
12月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
缓存 JavaScript 前端开发
mapbox没有token/token失效,地图闪烁后变空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.
本博客介绍了mapbox如何去除token验证,暴力破解mapbox的token验证机制。一劳永逸解决mapbox地图闪现一下然后变成空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.的方法,还介绍了类似问题的具体解决思路。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
307 9
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
1021 1
下一篇
开通oss服务