Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

安装

  1. npm i jsonwebtoken

配置

config / config.default.js 中配置 jwt

  1. /********** token 配置 **********/
  2. config.jwt = {
  3. secret: 'bcrypt',
  4. expiresIn: 60*60*2 // 2小时过期
  5. }

登录

密钥在配置中获取

  1. const jsonwebtoken = require("jsonwebtoken")
  2. async login(ctx){
  3. const {id,userName} = user;
  4. //secret为密钥,expiresIn为过期时间,sign第一个参数只能为对象,如果是字符串,会报错哦
  5. const token = jsonwebtoken.sign({id,userName},this.config.jwt.secret,{expiresIn: this.config.jwt.expiresIn});
  6. ctx.body = {token}
  7. }

请求

  1. axios({
  2. method: 'get',
  3. url: '/xxxx/xxxx',
  4. headers{
  5. //Authorization:Bearer为固定写法
  6. Authorization:Bearer xxxxx.xxxxxxx.xxxxx,
  7. Content-Type:application/json
  8. }
  9. })

验证token

  1. const jsonwebtoken = require("jsonwebtoken")
  2. const auth = async () =>{
  3. const {authorization = ''} = ctx.request.header;
  4. const token = authorization.replace('Bearer ','');
  5. //验证
  6. try{
  7. const user = jsonwebtoken.verify(token,secret);
  8. ctx.state.user = user
  9. }catch(err){
  10. ctx.status = 401;
  11. ctx.body={
  12. err:err.message
  13. }
  14. return;
  15. }
  16. await next();
  17. }

验证权限

  1. async checkOwner(ctx,next){
  2. if(ctx.params.id !== ctx.state.user.id){
  3. ctx.status = 401;
  4. ctx.body={
  5. err:err.message
  6. }
  7. return;
  8. }
  9. }

使用koa-jwt验证token

  1. const jwt = require('koa-jwt');
  2. const auth = jwt({token})