美文网首页
egg-jwt生成token,登录验证

egg-jwt生成token,登录验证

作者: 凉生可可 | 来源:发表于2020-04-09 10:16 被阅读0次

    下载

    首先用npm下载egg-jwt

    npm init egg-jwt --save
    

    配置

    plugin.js

     jwt: {
        enable: true,
        package: 'egg-jwt',
      }
    

    config.default.js

     config.jwt = {  //jwt配置项
        secret: "123456"
      }
    

    生成Token

    controller 中的 login.js

               const { ctx,app} = this;
                const token = app.jwt.sign({
    
                    'username': username, //需要存储的 token 数据
                    //......
    
                }, app.config.jwt.secret);
                console.log(token)
                ctx.set({'authorization':token})//设置headers
    

    前端可以根据responseheaders是否携带名为authorizationtoken来判断是否需要跳到登陆页

    前端

    // request拦截器, 改变url 或 options.
    request.interceptors.request.use(async (url, options) => {
      let token = localStorage.getItem('authorization');
      let headers = {
        'Content-Type': 'application/json',
        Accept: 'application/json'
      };
    console.log(token)
      if (token != null) {
        headers['authorization'] = `Bearer ${token}`; //使用插件验证要在前面加上 Bearer 字符串和一个空格,封装为中间件则不需要(感谢评论区提醒)
        return {
          url,
          options: { ...options, headers }
        };
      }else{
        console.log(2222222)
        router.push('/login');
        return {
          url,
          options: { ...options, headers }
        };
      }
      
    });
    

    封装为中间件

    //middleware/jwtErr.js
    module.exports = (options) => {
        return async function jwtErr(ctx, next) {
            const token = ctx.request.header.authorization;
            let decode = '';
            if (token) {
              try {
                // 解码token
                decode = ctx.app.jwt.verify(token, options.secret);
                await next();
                console.log('decode======>',decode);
              } catch (error) {
                ctx.status = 401;
                ctx.body = {
                  message: error.message,
                };
                return;
              }
            } else {
              ctx.status = 401;
              ctx.body = {
                message: '没有token',
              };
              return;
            }
          };
    }
    

    使用

    //router.js
    module.exports = app => {
      const { router, controller ,middleware} = app;
      const jwtErr = middleware.jwtErr(app.config.jwt)
      router.post('/api/login',controller.user.login);
      router.post('/api/register',controller.user.register);
      router.get('/api/userInfo',jwtErr,controller.user.userInfo);
      router.post('/api/upload',controller.upload.upload);
    };
    

    相关文章

      网友评论

          本文标题:egg-jwt生成token,登录验证

          本文链接:https://www.haomeiwen.com/subject/rootmhtx.html