为什么需要token
在后台管理系统中,我们通常使用cookie-session的方式用于鉴权,jwt实现token鉴权(nodejs koa) 但这种方式存在着以下问题
  1. 比如cookie的容量太小、
  2. 浏览器端和app端发送http请求时携带cookie会有差异、
  3. 分布式系统和服务器集群保证如何保证sessionId是相同,
基于以上问题,有了token这种方式,token的鉴权不受浏览器或app端的限制,通用性安全性都更强。
 
数据格式
实现token的鉴权方式通常使用jwt,即json web token,jwt的格式如 xxx.yyy.zzz
  • xxx的部分用来描述使用什么样的加密方式,
  • yyy的部分是携带的数据,比如id,name,通常还会携带 iat(issue at)发布时间, exp(expiration time)过期时间,用于鉴权的时候判断此token是否在有效期内,以上xxx和yyy都是对json数据以base64编码的方式进行转换,
  • 而zzz是对xxx.yyy再加上密钥进行加密,加密的方式在header中。
 
比如上图中,服务器生成token使用的加密方式是 HS256,需保存的内容为 id 和 name,密钥为123456
  • header 部分
{"alg":"HS256","typ":"JWT"}
// base64编码结果:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  • playload部分
{"id":1,"name":"Alice","iat":1630814528619,"exp":1630816048023}
// base64编码结果:eyJpZCI6MSwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjMwODE0NTI4NjE5LCJleHAiOjE2MzA4MTYwNDgwMjN9
  • signature部分
加密结果为:B2df_qYbivZcjpJ_QtIyRu4ts6n_pwxlSQl41Bpsxz8

最后的结果就是把三部分拼接起来,以 . 分隔

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjMwODE0NTI4NjE5LCJleHAiOjE2MzA4MTYwNDgwMjN9.B2df_qYbivZcjpJ_QtIyRu4ts6n_pwxlSQl41Bpsxz8

 
可以看到jwt的header和payload都是用base64进行编码的,也可解码,所以并不能存放重要信息,而jwt数据的传递也不是为了加密重要信息,jwt的singature部分是需要通过密钥来加密的,只要密钥不泄露,身份就不容易被伪造。
 
如何使用
jwt可以用于客户端向服务器发送的请求的时候携带,放置到 header中,使用 authorization 这个字段,使用 Bearer的方式
 
 
公钥和私钥
  • 对称加密算法,只用一个密钥加密和解密
  • 非对称加密算法,公钥用于加密,私钥用于解密

openssl中可以生成公钥和私钥

// 生成公钥
genrsa -out private.key 2048
// 生成私钥
rsa -in private.key -puout -out public.key

分别生成 public.key 和 private.key 文件

 
服务器如何鉴权
用户登录成功后,服务器返回token,以Koa来做个演示
const jwt = require("jsonwebtoken")
const PRIVATE_KEY = fs.readFileSync('./private.key') const user = { id: 1, name: 'kiki'}
const token = jwt.sign(user, PRIVATE_KEY, {
expiresIn: 10, // 单位s
algorithm: "RS256"
})

客户端将在header中的authorization携带token数据,服务器校验token的有效性和正确性

const PUBLIC_KEY = fs.readFileSync('./public.key')

const authorization = ctx.headers.authorization
const token = authorization.replace("Bearer ", "") // 如果失败会直接报错, 所以需要捕获
try {
const result = jwt.verify(token, PUBLIC_KEY, {
algorithms: ["RS256"]
})
// 拿到的信息是 { id: 1, name: 'kiki', iat: '', exp: ''}
} catch(error){ }

jwt实现token鉴权(nodejs koa)的更多相关文章

  1. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  2. # RESTful登录(基于token鉴权)的设计实例

    使用场景 现在很多基于restful的api接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做token的东西.申请成功后,后面其他的支付请求都要带上这个token ...

  3. 全栈项目|小书架|微信小程序-登录及token鉴权

    小程序登录 之前也写过微信小程序登录的相关文章: 微信小程序~新版授权用户登录例子 微信小程序-携带Token无感知登录的网络请求方案 微信小程序开通云开发并利用云函数获取Openid 也可以通过官方 ...

  4. Postman 关联接口测试(带有token鉴权)

    Postman 关联接口测试(带有token鉴权) 一.登陆接口 创建一个request请求 在Tests中添加JavaScript代码,用来获取鉴权 pm.test("V2", ...

  5. RESTful登录设计(基于Spring及Redis的Token鉴权)

    转载自:http://www.scienjus.com/restful-token-authorization/ http://m.blog.csdn.net/article/details?id=4 ...

  6. 关于防范csrf攻击基于token鉴权

    在web开发中,之前都使用cookie + session方式来实现身份认证鉴权.但是现在前后端分离,以及终端有可能不支持cookie的情况下,一般都采用token方式.现在系统设计思路如下: 服务端 ...

  7. Python接口自动化基础---token鉴权

    有些登录使用cookie,有些登录需要token验证,token传参一般有两种形式,一种是在请求头中,一种是使用URL传参 这里举例说明一下请求头中的token方式: #登录 param1={'use ...

  8. token鉴权的一种实现方式图解

  9. koa2服务端使用jwt进行鉴权及路由权限分发

    大体思路 后端书写REST api时,有一些api是非常敏感的,比如获取用户个人信息,查看所有用户列表,修改密码等.如果不对这些api进行保护,那么别人就可以很容易地获取并调用这些 api 进行操作. ...

  10. Session, Token, OAuth 鉴权那些事儿

    鉴权那些事 整体思路 无论什么样的服务, Web 服务总是不能绕开鉴权这个话题的, 通过有效的鉴权手段来保护网站数据, 来为特定用户提供服务. 整体来说, 有三种方式: Session-Cookie ...

随机推荐

  1. Wolai 使用教程:嵌入小组件库,打造精美、强大的知识库主页

    Wolai /我来云笔记在 2022.7.11 日的更新中,支持嵌入包括 NotionPet.芦笋.Replit 等在内的第三方应用.感谢 Wolai 云笔记官方对于 NotionPet 的支持. 趁 ...

  2. 2022-05-08:给你一个下标从 0 开始的字符串数组 words 。每个字符串都只包含 小写英文字母 。words 中任意一个子串中,每个字母都至多只出现一次。 如果通过以下操作之一,我们可以

    2022-05-08:给你一个下标从 0 开始的字符串数组 words .每个字符串都只包含 小写英文字母 .words 中任意一个子串中,每个字母都至多只出现一次. 如果通过以下操作之一,我们可以从 ...

  3. uni-app 真机运行

    运行-运行到手机或模拟器 注意事项: 1.真机运行时需要开启开发者选项中的USB调试和USB安装,否则app无法通过USB安装到手机或平板中. 2.模拟器功能有,单模拟机没有,需要自己安装,然后开放端 ...

  4. 自定义 coding.net 静态网站域名

    点击文章左下角 "阅读原文",预览本文章的示例站点. 在上一篇文章<使用 coding.net 发布你的个人博客>,我们介绍了怎么在 coding.net 部署个人的静 ...

  5. 浅谈 ByteHouse Projection 优化实践

    预聚合是 OLAP 系统中常用的一种优化手段,在通过在加载数据时就进行部分聚合计算,生成聚合后的中间表或视图,从而在查询时直接使用这些预先计算好的聚合结果,提高查询性能,实现这种预聚合方法大多都使用物 ...

  6. 【Python入门教程】Python常用表格函数&操作(xlrd、xlwt、openpyxl、xlwings)

    ​         在我们使用Python时,避免不了与Excel打交道.同样Python的三方库和代码的简洁性也为我们处理大数据提供了便利.今天给大家介绍一下常用的处理表格的函数,同时还有一些常用的 ...

  7. [ARM 汇编]进阶篇—存储访问指令—2.3.3 栈操作指令

    栈是一种特殊的数据结构,其特点是后进先出(LIFO,Last In First Out).在 ARM 汇编中,栈通常用于保存函数调用时的寄存器状态.局部变量和返回地址等.本节将详细介绍 ARM 汇编中 ...

  8. 2023-06-17:说一说redis中渐进式rehash?

    2023-06-17:说一说redis中渐进式rehash? 答案2023-06-17: 在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率.为了解决这个问题,R ...

  9. 前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用

    前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13128 效 ...

  10. The content of element type “web-app“ must match 解决方法

    报错原因 ‍ 问题描述 : 在创建 SpringMVC 时 , 选用 idea 的 webapp 模板来创建 , xml 配置文件中进行配置时发现提示警告 警告如下: ‍ ​ ​ 这错误大概的意思就是 ...