1、Token认证机制
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或会话信息。这也就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登陆了,这就为应用的扩展提供了便利.
2、项目中使用Token的流程
- 前端使用用户名跟密码请求首次登录
- 后服务端收到请求,去验证用户名与密码是否正确
- 验证成功后,服务端会根据用户id、用户名、定义好的秘钥、过期时间生成一个 Token,再把这个 Token 发送给前端
- 前端收到 返回的Token ,把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 前端每次路由跳转,判断 localStroage 有无 token ,没有则跳转到登录页。有则请求获取用户信息,改变登录状态;
- 前端每次向服务端请求资源的时候需要在请求头里携带服务端签发的Token
- 服务端收到请求,然后去验证前端请求里面带着的 Token。没有或者 token 过期,返回401。如果验证成功,就向前端返回请求的数据。
- .前端得到 401 状态码,重定向到登录页面。
3、什么是JWT
JWT全称:Json web token 是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准
4、JWT的应用场景
一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,简而言之它就是从客户端发送给服务端的一种身份认证.
5、node中的express-jwt
express-jwt是nodejs的一个中间件,用来验证指定http请求的JsonWebTokens的有效性,express-jwt内部引用了jsonwebtoken,对其封装使用。 在实际的项目中这两个都需要引用,他们两个的定位不一样。jsonwebtoken是用来生成token给客户端的,express-jwt是用来验证token的。
// 前端
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token
// 引入
import expressJwt from "express-jwt"
import jwt from "jsonwebtoken"
// create token
function createToken(uid, role = null, tenant = null, language = null, level = null, fun = null) {
const exp = Date.now() + 1000 * 60 * 60 * 24 * TokenTimeOut
let obj = { uid, tenant, role, level, fun, exp }
return jwt.sign(obj, TokenKey)
}
<!--check token-->
function registerToken() {
return expressJwt({
secret: TokenKey,
credentialsRequired: false,
getToken: req => {
let token = null
if (req.headers.authorization && req.headers.authorization.split(" ")[0] === "Bearer") {
token = req.headers.authorization.split(" ")[1]
}
if (token) {
//将token解析,放入 req.jwt 内
let obj = jwt.verify(token, TokenKey)
obj.token = token
req.jwt = obj
}
return token
}
})
}
网友评论