nodejs JWT jsonwebtoken学習ノート


記事の目次
  • 文章は
  • を参照してください.
  • jsonwebtokenはtokenと検査token
  • を生成する.
    文章の参考
  • jsonwebtoken npm
  • jsonwebtoken紹介
  • jsonwebtokenはtokenと検査tokenを生成します.
  • controllerは、ユーザの要求を受信する
  • .
    var express = require('express')
    var connection = require('../common/mysqlConn')
    var userService = require('../service/userService')
    var jwtTools = require('../common/jwtTools')
    //     token
    const tokenCache = {
         }
    var router = express.Router()
    //         
    router.post('/login', function (req, res, next) {
         
      const pageObj = req.body
      var currentPage = parseInt(pageObj.currentPage) - 1
      let paramObj = {
         
        username: pageObj.username,
        pwd: pageObj.pwd,
      }
      userService.loginUser(paramObj, function (err, results, fields) {
         
        if (results.length > 0) {
         
          let token = jwtTools.createTokenByLoginInfo(results[0])
          tokenCache[token] = token
          res.json({
         
            state: 1, // 1      , 0    
            user: results[0],
            token,
          })
        } else {
         
          res.json({
         
            state: 0, // 1      , 0    
            message: '     ',
          })
        }
      })
    })
    
    //   token       
    router.post('/currenuser', function (req, res, next) {
         
      const headerObj = req.headers
      const tokenStr = headerObj.token
      if (!tokenStr) {
         
        res.json({
         
          state: 0, // 1      , 0    
          message: '  token',
        })
      } else {
         
        if (tokenCache[tokenStr]) {
         
          jwtTools.verifyToken(tokenStr).then((tokenResult) => {
         
            if (tokenResult.status) {
         
              res.json({
         
                state: 1, // 1      , 0    
                user: tokenResult.code,
              })
            } else {
         
              res.json({
         
                state: 0, // 1      , 0    
                message: 'token    ',
              })
            }
          })
        } else {
         
          res.json({
         
            state: 1, // 1      , 0    
            message: '  token',
          })
        }
      }
    })
    
  • jwt Tools.jsはtokenを作成し、tokenに基づいてユーザ情報
  • を取得する.
    const jwt = require('jsonwebtoken') //   jwt  
    
    const tokenConfig = {
         
      jwtsecret: '1qaz2wsx',
    }
    
    //     JSON    token
    const createTokenByLoginInfo = function (userInfo) {
         
      let tempUser = userInfo
      console.log(JSON.parse(JSON.stringify(tempUser)))
      let token = jwt.sign(JSON.parse(JSON.stringify(tempUser)), tokenConfig.jwtsecret, {
         
        expiresIn: 60 * 60 * 24, //     24  
      })
      return token
    }
    
    //   token     JSON  
    const verifyToken = function (token) {
         
      return new Promise((resolve, reject) => {
         
        jwt.verify(token, tokenConfig.jwtsecret, function (err, decoded) {
         
          if (err) {
         
            resolve({
         
              status: false,
              message: '   token.',
            })
          } else {
         
            resolve({
         
              status: true,
              message: '   token.',
              code: decoded,
            })
          }
        })
      })
    }
    
    //           token
    const authenticateJWT = (req, res, next) => {
         
      const authHeader = req.headers.authorization
      if (!authHeader) {
         
        res.sendStatus(401)
        return 
      }
    
      const token = authHeader.split(' ')[1]
      jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
         
        if (err) {
         
          res.sendStatus(403)
          return 
        }
        req.user = user
        next()
      })
    }
    
    module.exports = {
         
      authenticateJWT,
      createTokenByLoginInfo,
      verifyToken,
    }
    
  • JWTは統一的にブロッキングし、ルートを定義し、非登録インターフェースでは、tokenが
  • に持ってきたかどうかを検証する必要がある.
    const app = express();
    const jwtTools = require('./util/jwtTools')
    const server = http.createServer(app)
    
    //      /
    app.all('*', function(req, res, next) {
         
      console.log(req.headers.origin)
      console.log(req.environ)
      res.header("Access-Control-Allow-Origin", req.headers.origin);
      // res.header("Access-Control-Allow-Origin", '*');
      res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
      res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
      res.header("Access-Control-Allow-Credentials","true");
      res.header("X-Powered-By",' 3.2.1')
      if(req.method === "OPTIONS") res.send(200);/* options      */
      else  next();
    });
    
    //      token /
    app.all('*', function(req, res, next) {
         
      //           ,      token
      if (req.path !== '/api/users/login' && req.path !== '/api/users') {
         
        jwtTools.authenticateJWT(req, res, next)
      } else {
         
        next()
      }
    });
    
  • , token、もし反転したら、最初のoption要求がブロックされ、永遠に成功しません.
  • クロスドメインの問題については、nodejs expressを参照して、クロスドメイン設定
  • を許可する.
  • クライアントは、要求ヘッドにAuthorzation検証タイプを加えることがビーバー
  • である.
    {
         
    	header: {
         
    		Authorization: 'Bearer jwtTokenStr'
    	}
    }
    
    注意Bearer jwtTokenStr