Jwt
介绍
Json Web Token
- JSON Web Token(JWT)是一个开放标准(RFC 7519)
- 它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。
- 此信息可以被验证和信任,因为它是数字签名的。
构成
- Header(头部)
- Payload (负载)
- Signature (签名)
Header
typ
token类型
alg
指定hash算法
Payload
- 存储需要传递的信息,如用户id、用户名等
- 还包含元数据,如过期时间、发布人等
- 与Header不同,Payload可以被加密
Signature
- 对 Header、Payload 进行签名,防止数据篡改
- 保证Token在传输过程中不被篡改或者伪造
示列:
eyJhbGciOiJIUz.eyJzdWIiOiIxMjjoxNTE2MjM5MDIyfQ.p9zvxkUcmyjQaOJWe
eyJhbGciOiJIUz.eyJzdWIiOiIxMjjoxNTE2MjM5MDIyfQ.p9zvxkUcmyjQaOJWe
工作原理
实战
- 安装 jsonwebtoken
- 生成签名
- 校验签名
安装jwt
bash
npm i jsonwebtoken --save
npm i jsonwebtoken --save
生成签名
javascript
// Header + Payload + Signature
// 登录的token
const token = jsonWebToken.sign({
_id: res._id,
userName: res.userName
}, config.JWT_SECRET, {
expiresIn: '7d'
});
// Header + Payload + Signature
// 登录的token
const token = jsonWebToken.sign({
_id: res._id,
userName: res.userName
}, config.JWT_SECRET, {
expiresIn: '7d'
});
校验签名
校验token,并获取用户信息 存放在 ctx.state.user
- jsonwebtoken 实现用户认证与授权
javascript
let auth = async (ctx, next) => {
let { authorization } = ctx.header;
// 获取请求头的token
let token = authorization.replace('Bearer ', '');
try {
// 校验token,并获取用户信息
let authData = jsonWebToken.verify(token, config.JWT_SECRET);
let {
_id,
userId,
userName
} = authData;
ctx.state.user = {
_id,
userId,
userName
};
await next();
} catch (e) {
ctx.throw('403', e.message);
}
};
let auth = async (ctx, next) => {
let { authorization } = ctx.header;
// 获取请求头的token
let token = authorization.replace('Bearer ', '');
try {
// 校验token,并获取用户信息
let authData = jsonWebToken.verify(token, config.JWT_SECRET);
let {
_id,
userId,
userName
} = authData;
ctx.state.user = {
_id,
userId,
userName
};
await next();
} catch (e) {
ctx.throw('403', e.message);
}
};
- koa-jwt 实现用户认证与授权
javascript
const jwt = require('koa-jwt');
// token 校验
let auth = jwt({secret: config.JWT_SECRET});
const jwt = require('koa-jwt');
// token 校验
let auth = jwt({secret: config.JWT_SECRET});
koa-jwt
用koa-jwt中间件实现用户认证与授权
安装koa-jwt
bash
npm i koa-jwt --save
npm i koa-jwt --save
使用中间件保护接口
javascript
const jwt = require('koa-jwt');
// token 校验
let auth = jwt({secret: config.JWT_SECRET});
const jwt = require('koa-jwt');
// token 校验
let auth = jwt({secret: config.JWT_SECRET});
使用中间件获取用户信息
// 校验是否当前登录账号
async checkOwner(ctx, next) {
console.log(ctx.state);
if (ctx.params.id !== ctx.state.user._id) { ctx.throw(403, '没有权限'); }
await next();
}
// 校验是否当前登录账号
async checkOwner(ctx, next) {
console.log(ctx.state);
if (ctx.params.id !== ctx.state.user._id) { ctx.throw(403, '没有权限'); }
await next();
}