全棧之初識(shí) Passport & Passport-jwt – Web安全的守護(hù)神

一操漠、Passport 簡(jiǎn)介

passport.js是Nodejs中的一個(gè)做登錄驗(yàn)證的中間件烹笔,極其靈活和模塊化,并且可與Express澄耍、Sails等Web框架無(wú)縫集成噪珊。Passport功能單一,即只能做登錄驗(yàn)證齐莲,但非常強(qiáng)大痢站,支持本地賬號(hào)驗(yàn)證第三方賬號(hào)登錄驗(yàn)證(OAuth和OpenID等),支持大多數(shù)Web網(wǎng)站和服務(wù)选酗。

二阵难、Passport詳解

具體詳解 W3Cschool 有詳細(xì)教程,這里不再贅述芒填。
https://www.w3cschool.cn/passport_js_note/ncgd1ozt.html

三呜叫、Passport-jwt

1、安裝

npm install passport-jwt

2殿衰、用法

(1)怀偷、配置策略
JWT認(rèn)證策略的構(gòu)造如下:

new JwtStrategy(options, verify)

參數(shù):
options 是包含用于控制如何從請(qǐng)求中提取令牌或者被驗(yàn)證的選項(xiàng)的對(duì)象文本。

  • secretOrKey 是包含加密( 對(duì)稱) 或者 public 編碼密鑰( 非對(duì)稱)的字符串或者緩沖區(qū)播玖,用于驗(yàn)證令牌的簽名。 除非提供 secretOrKeyProvider饭于,否則需要蜀踏。
  • secretOrKeyProvider 是格式中的回調(diào) function secretOrKeyProvider(request, rawJwtToken, done) 應(yīng)該為給定密鑰和請(qǐng)求組合調(diào)用一個(gè)密碼或者 done 編碼的public 密鑰( 非對(duì)稱)维蒙。 donefunction done(err, secret) 格式接受參數(shù)。 除非提供 secretOrKey果覆,否則需要颅痊。
  • jwtFromRequest 接受請(qǐng)求作為唯一參數(shù)并將作為字符串或者字符串返回的jwtFromRequest ( 必選) 函數(shù) null。 有關(guān)詳細(xì)信息局待,請(qǐng)參閱從請(qǐng)求列表中提取 JWT斑响。
  • issuer: 如果定義了令牌頒發(fā)者( iss ),將根據(jù)這個(gè)值驗(yàn)證钳榨。
  • audience: 如果定義了舰罚,則令牌受眾( 音頻) 將根據(jù)這里值進(jìn)行驗(yàn)證。
  • algorithms: 帶允許算法名稱的字符串列表薛耻。 例如 ["HS256","HS384"]营罢。
  • ignoreExpiration: 如果 true 不驗(yàn)證令牌的到期時(shí)間。
  • passReqToCallback: 如果 true饼齿,請(qǐng)求將被傳遞到驗(yàn)證回調(diào)饲漾。 verify( req,jwt_payload缕溉,done_callback )考传。
  • jsonWebTokenOptions: passport-jwt使用 jsonwebtoken 驗(yàn)證令牌。

verify 是具有參數(shù) verify(jwt_payload, done)的函數(shù)

  • jwt_payload 是包含解碼的JWT負(fù)載的對(duì)象文字证鸥。
  • done 是 Passport 錯(cuò)誤僚楞,第一個(gè)回調(diào)接受參數(shù)( 錯(cuò)誤,用戶敌土,信息)

(2) 從請(qǐng)求中提取 JWT
可以將JWT包含在請(qǐng)求中的方法有多種镜硕。 為了保持盡可以能靈活,JWT從請(qǐng)求中解析為 jwtFromRequest 參數(shù)傳遞的用戶回調(diào)返干。 從現(xiàn)在開(kāi)始兴枯,這個(gè)回調(diào)將接受請(qǐng)求對(duì)象作為參數(shù),并返回編碼的JWT字符串或者 null矩欠。

passport-jwt.ExtractJwt 中提供了許多提取器工廠函數(shù)财剖。 這些工廠函數(shù)返回一個(gè)使用給定參數(shù)配置的新抽取器。

  • fromHeader(header_name) 創(chuàng)建一個(gè)新的提取器癌淮,它在給定的http頭中查找 JWT
  • fromBodyField(field_name) 創(chuàng)建一個(gè)新的提取器躺坟,它在給定的主體字段中查找 JWT。 你必須配置了主體解析器才能使用這里方法乳蓄。
  • fromUrlQueryParameter(param_name) 創(chuàng)建一個(gè)新的提取器咪橙,它在給定的URL查詢參數(shù)中查找 JWT。
  • fromAuthHeaderWithScheme(auth_scheme) 為在授權(quán)標(biāo)頭中查找JWT創(chuàng)建一個(gè)新的提取器,期望該方案匹配 auth_scheme美侦。
  • fromAuthHeaderAsBearerToken() 創(chuàng)建一個(gè)新的提取器产舞,該提取器在授權(quán)標(biāo)頭中查找該方案"with"的JWT'
  • fromExtractors([array of extractor functions]) 使用提供的提取器的array 創(chuàng)建一個(gè)新的提取器。 每個(gè)提取器都按順序嘗試菠剩,直到返回一個(gè)標(biāo)記易猫。

(3)編寫自定義提取程序函數(shù)
如果所提供的提取器不滿足你的需求,你可以輕松提供你自己的回調(diào)具壮。 例如准颓,如果使用cookie解析器中間件并想在cookie中提取 JWT,可以使用以下函數(shù)作為jwtFromRequest選項(xiàng)的參數(shù):

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

(4) passport-local 策略實(shí)例

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)
    }
  }))
}

如果想繼續(xù)學(xué)習(xí) JWT 請(qǐng)查看我另外一篇文章:
全棧之初識(shí)JWT -- Web安全的守護(hù)神
如果想繼續(xù)學(xué)習(xí) JWT && Passport 聯(lián)合應(yīng)用 請(qǐng)查看我另外一篇文章:
全棧之鑒權(quán)之旅 -- JWT + passport 實(shí)現(xiàn) Token 驗(yàn)證(Node + Express)


覺(jué)得有幫助的小伙伴右上角點(diǎn)個(gè)贊~

在這里插入圖片描述

掃描上方二維碼關(guān)注我的訂閱號(hào)~

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布棺妓!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攘已,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涧郊,更是在濱河造成了極大的恐慌贯被,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妆艘,死亡現(xiàn)場(chǎng)離奇詭異彤灶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)批旺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門幌陕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人汽煮,你說(shuō)我怎么就攤上這事搏熄。” “怎么了暇赤?”我有些...
    開(kāi)封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵心例,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鞋囊,道長(zhǎng)止后,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任溜腐,我火速辦了婚禮译株,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挺益。我一直安慰自己歉糜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布望众。 她就那樣靜靜地躺著匪补,像睡著了一般伞辛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叉袍,一...
    開(kāi)封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天始锚,我揣著相機(jī)與錄音,去河邊找鬼喳逛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棵里,可吹牛的內(nèi)容都是我干的润文。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼殿怜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼典蝌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起头谜,我...
    開(kāi)封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骏掀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后柱告,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體截驮,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年际度,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葵袭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乖菱,死狀恐怖坡锡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窒所,我是刑警寧澤鹉勒,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站吵取,受9級(jí)特大地震影響禽额,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜海渊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一绵疲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧臣疑,春花似錦盔憨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)婿奔。三九已至,卻和暖如春问慎,著一層夾襖步出監(jiān)牢的瞬間萍摊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工如叼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冰木,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓笼恰,卻偏偏與公主長(zhǎng)得像踊沸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子社证,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容