NodeJSでtoken生成と認証


  • は、依存koa、koa-router、Baic-auth、jsonwebtoken
    // package.json
    "dependencies": {
           
        "basic-auth": "^2.0.1",
        "jsonwebtoken": "^8.4.0",
        "koa": "^2.7.0",
        "koa-router": "^7.4.0"
      }
    
  • を導入する.
  • は、token
    const jwt = require('jsonwebtoken')
    
    const generateToken = function(uid, scope){
           
        const secretKey = "abcdefg"; //   token    ,    
        const expiresIn = 60*60; //    token    
        //   token
        //             token        ,uid   id,scope     ;
        //            ;
        //              ,expiresIn    token    
        const token = jwt.sign({
           
            uid,
            scope
        },secretKey,{
           
            expiresIn
        })
        return token
    }
    
  • を生成する.
  • token認証
  • token認証を作成するミドルウェア
    const baseAuth = require("basic-auth");
    const jwt = require("jsonwebtoken");
    
    class Authenticate {
             
        constructor() {
             
        }
    
        // auth   ,    ,        (   )
        get auth() {
             
            //   token     (        ,      )
            return async (ctx, next) => {
             
                //   baseAuth    ctx.req,   ctx.request,ctx.req node.js   request  , ctx.request koa   request      
                const userToken = baseAuth(ctx.req);
                if(!userToken || !userToken.name) {
             
                    //         
                    throw new global.errors.Forbidden("token      ");
                }
                let decode;
                try {
             
                    //    token         ,         
                    const secretKey = "abcdefg";
                    //  token      ,     token      
                    decode = jwt.verify(userToken.name, secretKey);
                } catch(error) {
             
                    if(error.name === "TokenExpiredError") {
             
                        throw new global.errors.Forbidden("token     ");
                    }
                    throw new global.errors.Forbidden("token    ");
                }
                //         ctx ,             
                ctx.auth = {
             
                    uid: decode.uid,
                    scope: decode.scope
                }
                //        await,        ,     next(),           
                await next();
            }
        }
    }
    
    module.exports = {
             
        Authenticate
    };
    
  • tokenを使用して中間部品
    const Router = require("koa-router");
    const {
             Authenticate} = require("../../../middlewares/authenticate");
    const router = new Router({
             
        prefix: "/v1/classic" //     
    })
    
    // router          ,        ,            ,          ,           
    router.get("/laster", new Authenticate().auth(      ), (ctx, next) => {
             
      ctx.body = ctx.auth;
    }(      ))
    
    を認証した場合、最初の中間部品(new Authenticate().auth)でtokenが認証されていないため、異常が発生した場合、次の中間部品には入らない(
  • ).
  • アクセス:url GET http:localhost:8082/v 1/classic/lasterはPostManに要求を送信し、要求方式はGET、AuthenrizationのTypeはBase Authを選択し、パラメータUsernameは上に生成されたtokenを記入し、Passwordは
  • を埋めないで空振りします.