一操漠、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ù)选酗。
- 官網(wǎng): http://passportjs.org/
- Github: http://github.com/jaredhanson/passport
- NPM: https://www.npmjs.org/package/passport
二阵难、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ì)稱)维蒙。done
以function 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ā)布棺妓!