全棧之初識 Passport & Passport-jwt – Web安全的守護神

1、Passport 簡介

passport.js是Nodejs中的一個作登陸驗證的中間件,極其靈活和模塊化,而且可與Express、Sails等Web框架無縫集成。Passport功能單一,即只能作登陸驗證,但很是強大,支持本地帳號驗證第三方帳號登陸驗證(OAuth和OpenID等),支持大多數Web網站和服務。html

2、Passport詳解

具體詳解 W3Cschool 有詳細教程,這裏再也不贅述。
https://www.w3cschool.cn/passport_js_note/ncgd1ozt.htmlgit

3、Passport-jwt

一、安裝

npm install passport-jwt

二、用法

(1)、配置策略
JWT認證策略的構造以下:github

new JwtStrategy(options, verify)

參數:
options 是包含用於控制如何從請求中提取令牌或者被驗證的選項的對象文本。web

  • secretOrKey 是包含加密( 對稱) 或者 public 編碼密鑰( 非對稱)的字符串或者緩衝區,用於驗證令牌的簽名。 除非提供 secretOrKeyProvider,不然須要。
  • secretOrKeyProvider 是格式中的回調 function secretOrKeyProvider(request, rawJwtToken, done) 應該爲給定密鑰和請求組合調用一個密碼或者 done 編碼的public 密鑰( 非對稱)。 donefunction done(err, secret) 格式接受參數。 除非提供 secretOrKey,不然須要。
  • jwtFromRequest 接受請求做爲惟一參數並將做爲字符串或者字符串返回的jwtFromRequest ( 必選) 函數 null。 有關詳細信息,請參閱從請求列表中提取 JWT
  • issuer: 若是定義了令牌頒發者( iss ),將根據這個值驗證。
  • audience: 若是定義了,則令牌受衆( 音頻) 將根據這裏值進行驗證。
  • algorithms: 帶容許算法名稱的字符串列表。 例如 ["HS256","HS384"]
  • ignoreExpiration: 若是 true 不驗證令牌的到期時間。
  • passReqToCallback: 若是 true,請求將被傳遞到驗證回調。 verify( req,jwt_payload,done_callback )
  • jsonWebTokenOptions: passport-jwt使用 jsonwebtoken 驗證令牌。

verify 是具備參數 verify(jwt_payload, done)的函數算法

  • jwt_payload 是包含解碼的JWT負載的對象文字。
  • done 是 Passport 錯誤,第一個回調接受參數( 錯誤,用戶,信息)

(2) 從請求中提取 JWT
能夠將JWT包含在請求中的方法有多種。 爲了保持盡能夠能靈活,JWT從請求中解析爲 jwtFromRequest 參數傳遞的用戶回調。 從如今開始,這個回調將接受請求對象做爲參數,並返回編碼的JWT字符串或者 null。npm

passport-jwt.ExtractJwt 中提供了許多提取器工廠函數。 這些工廠函數返回一個使用給定參數配置的新抽取器。json

  • fromHeader(header_name) 建立一個新的提取器,它在給定的http頭中查找 JWT
  • fromBodyField(field_name) 建立一個新的提取器,它在給定的主體字段中查找 JWT。 你必須配置了主體解析器才能使用這裏方法。
  • fromUrlQueryParameter(param_name) 建立一個新的提取器,它在給定的URL查詢參數中查找 JWT。
  • fromAuthHeaderWithScheme(auth_scheme) 爲在受權標頭中查找JWT建立一個新的提取器,指望該方案匹配 auth_scheme。
  • fromAuthHeaderAsBearerToken() 建立一個新的提取器,該提取器在受權標頭中查找該方案"with"的JWT'
  • fromExtractors([array of extractor functions]) 使用提供的提取器的array 建立一個新的提取器。 每一個提取器都按順序嘗試,直到返回一個標記。

(3)編寫自定義提取程序函數
若是所提供的提取器不知足你的需求,你能夠輕鬆提供你本身的回調。 例如,若是使用cookie解析器中間件並想在cookie中提取 JWT,可使用如下函數做爲jwtFromRequest選項的參數:安全

var cookieExtractor = function(req) {
 var token = null;
 if (req && req.cookies) {
     token = req.cookies['jwt'];
 }
 return token;
};

(4) passport-local 策略實例cookie

const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt
const User = require('../models/user')

const config = require('../config')

const opts = {
  // Prepare the extractor from the header.
  jwtFromRequest: ExtractJwt.fromExtractors([
    req => req.cookies['authorization'],
    ExtractJwt.fromUrlQueryParameter('access_token'),
    ExtractJwt.fromAuthHeaderWithScheme('Bearer'),
  ]),
  // Use the secret passed in which is loaded from the environment. This can be
  // a certificate (loaded) or a HMAC key.
  secretOrKey: config.JWT_SECRET,
  // Verify the issuer.
  issuer: config.JWT_ISSUER,
  // Verify the audience.
  audience: config.JWT_AUDIENCE,
  // Enable only the HS256 algorithm.
  algorithms: [config.JWT_ALG],
  // Pass the request object back to the callback so we can attach the JWT to it.
  passReqToCallback: true
}

module.exports = passport => {
  passport.use(new JwtStrategy(opts, async function (req, jwt_payload, done) {
    try {
      const userInfo = await User.findOne({
        user_uuid: jwt_payload.user_uuid
      })
      if (userInfo && userInfo.user_role > 0) {
        done(null, userInfo)
      } else {
        done(null, false)
      }
    } catch (e) {
      return done(e)
    }
  }))
}

若是想繼續學習 JWT 請查看我另一篇文章:
全棧之初識JWT -- Web安全的守護神
若是想繼續學習 JWT && Passport 聯合應用 請查看我另一篇文章:
全棧之鑑權之旅 -- JWT + passport 實現 Token 驗證(Node + Express)

以爲有幫助的小夥伴右上角點個贊~

在這裏插入圖片描述

掃描上方二維碼關注個人訂閱號~

本文由博客一文多發平臺 OpenWrite 發佈!
相關文章
相關標籤/搜索