介绍
Json Web Token
构成
Header
typ
alg
指定hash算法
Payload
Signature
示列:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
p9zvxkUcmyjQaOJWeGhgPp0s-3jjQ2jGtsbFIi0wsOU
工作原理
实战
安装jwt
npm i jsonwebtoken --save
生成签名
// Header + Payload + Signature
// 登录的token
const token = jsonWebToken.sign({
_id: res._id,
userName: res.userName
}, config.JWT_SECRET, {
expiresIn: '7d'
});
校验签名
校验token,并获取用户信息 存放在 ctx.state.user
jsonwebtoken 实现用户认证与授权
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});
<a name="ayufK"></a>
## koa-jwt
用koa-jwt中间件实现用户认证与授权
<a name="Q5E2b"></a>
### 安装koa-jwt
```bash
npm i koa-jwt --save
使用中间件保护接口
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();
}