导语:由于http是无状态的,请求响应过程中不存储记录用户身份信息,所以就出现了很多用户识别存储用户身份的方法,比如cookie,session,jwt。我最近做的一个接口服务使用了jwt来存储管理用户信息,相较于本地cookie存储,服务器端session存储,jwt就变得比较安全和节省方便,本文就jwt在node服务中的使用方法做一个简单的总结。
目录
- jwt简介
- 安装配置
- 封装方法
- 实战练习
本文从以上四个方面介绍jwt的使用。
jwt简介
概念
JWT全称JSON Web Token,它是一种开放标准RFC 7519,定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。JWT可以使用密钥或使用RSA或ECDSA的公钥/私钥对进行签名,可以对签名进行验证。
组成部分
jwt签名令牌一般由三部分组成,分别是Header(头部信息),Payload(载荷),Signature(签名),例如xxxxx.yyyyy.zzzzz
。
- header
一般是存储令牌的类型和签名算法,比如:
{
"alg": "HS256",
"typ": "JWT"
}
- Payload
一般是存储声明,也就是用户信息和附件数据,分为注册声明、公共声明和私人声明。
比如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- 签名
利用签名算法对Header和Payload进行签名
比如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
那么一个标准的jwt签名令牌会是这样的eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
。
应用场景
- 用户授权访问
比如用户登录后,服务端下发一个jwt令牌给客户端,每次用户请求数据都在请求头里面携带此令牌,服务端验证通过后可以获取到数据,这种方式开销很小,并不需要服务端进行存储,而且还可以跨域使用。
- 信息交换
在各方之间存储加密信息,验证签名内容是否篡改。
安全性
由于令牌可以被拆解,里面的header和Payload可以被解析看到,所以尽量不要在Payload里面存储一些私密的信息。
安装配置
下面就在node中使用jwt做一下操作。
在npm网站,有很多的jwt包,你可以选择你认为合适的。
搜索jwt
NAME | DESCRIPTION | AUTHOR | DATE | VERSION | KEYWORDS
jwt | JSON Web Token for… | =mattrobenolt | 2012-05-05 | 0.2.0 |
express-jwt | JWT authentication… | =woloski… | 2021-08-11 | 6.1.0 | auth authn authentication authz authorization http jwt token oauth express
jsonwebtoken | JSON Web Token… | =dschenkelman… | 2019-03-18 | 8.5.1 | jwt
jwt-decode | Decode JWT tokens,… | =jeff.shuman… | 2020-11-16 | 3.1.2 | jwt browser
passport-jwt | Passport… | =themikenichol… | 2018-03-13 | 4.0.0 | Passport Strategy JSON Web Token JWT
koa-jwt | Koa middleware for… | =stiang… | 2021-09-24 | 4.0.3 | auth authn authentication authz authorization http jwt json middleware token oauth permissions koa
jsrsasign | opensource free… | =kjur | 2021-12-01 | 10.5.1 | crypto cryptography Cipher RSA ECDSA DSA RSAPSS PKCS#1 PKCS#5 PKCS#8 private key public key CSR PKCS#10 hash function HMac ASN.1 certexpress-jwt-permissions | Express middleware… | =angryunicorn… | 2021-08-18 | 1.3.6 | express middleware JWT permissions authorization token security
njwt | JWT Library for… | =robertjd | 2021-12-03 | 1.2.0 | jwt
fastify-jwt | JWT utils for… | =starptech… | 2021-12-03 | 4.1.0 | jwt json token jsonwebtoken fastify
did-jwt | Library for Signing… | =simonas-notcat… | 2021-12-03 | 5.12.1 |
hapi-auth-jwt2 | Hapi.js… | =nelsonic | 2020-09-08 | 10.2.0 | Hapi.js Authentication Auth JSON Web Tokens JWT
auth0-lock | Auth0 Lock | =jeff.shuman… | 2021-11-02 | 11.31.1 | auth0 auth openid authentication passwordless browser jwt
jwks-rsa | Library to retrieve… | =jeff.shuman… | 2021-10-15 | 2.0.5 | jwks rsa jwt
restify-jwt-community | JWT authentication… | =frbuceta | 202