我決定使用 passport.js 來驗證我的節點應用程式。我為登錄和注冊實施了本地策略,它們運行良好,但有一個問題讓我感到困惑。我過去構建了一個模塊,它使用 http-error 包生成并回傳 http 錯誤。我用它來標準化錯誤生成。例如,如果某些憑據丟失或無效,我會打電話
Errors.ValidationError({name:"password",reason:"password field is missing in your request"})
這會創建并回傳一個正確的 http 錯誤,然后我將其發送給用戶。它對于錯誤生成很有用。我想將此邏輯與護照一起使用,因此我選擇創建自己的回呼。這是一些代碼:
本地登錄策略定義
/**
* User login
* @param {*} request
* @param {*} response
* @return {*} logged existant user or error
*/
passport.use('login',
new localStrategy(
{
usernameField: 'email',
passwordField: 'password',
},
async (email, password, done)=> {
if(email==null||password==null)
{
AppLogger.debug(21)
return done(null, false);
}
User.findOne({ email: email }).
then(async(user)=>{
if (!user) {
AppLogger.debug(22)
return done(null, false);
}
if (!(await user.verifyPassword(password))) {
AppLogger.debug(23)
return done(null, false);
}
return done(null, user);
}).
catch((err)=>{
AppLogger.debug(24)
return done(err);
});
}
)
);
登錄路徑
/**
* Login an existant user
*/
AuthRouter.post('/login', (req, res, next)=> {
passport.authenticate('login', (err, user, info) =>{
if (err) {
AppLogger.debug(1)
return next(err);
}
if (!user) {
AppLogger.debug(2)
return next(info);
}
req.login(user,(err)=>{
if(err){
AppLogger.debug(3)
return next(err);
}
res.send({
success:true,
message:"logged in"
})
})
})(req, res, next);
});
考慮到代碼上的所有除錯行,我得到了這個輸出: logs
我的日志行列印 2 這意味著沒有例外,但用戶為空,我試圖了解在登錄策略中究竟在哪里創建了丟失的憑據錯誤,以便我可以生成我的自定義 http 錯誤。奇怪的是,策略中的所有除錯都沒有被執行。請注意,有一個中間件可以捕獲所有錯誤和日志,因此錯誤日志來自那里。并且保持實物應用程式按預期作業,但我無法發現這個錯誤是在哪里產生的。我假設護照中間件中的某些方法會引發錯誤,并且我的日志中間件會捕獲它,但是我如何與之互動并以有意義的方式生成我的 http 錯誤?任何建議表示贊賞。
uj5u.com熱心網友回復:
這是我想出的解決方法:
路由器
/**
* Login an existant user
*/
AuthRouter.post('/login', (req, res, next)=> {
if(!req.body.email || !req.body.password){
const subErrors = []
if(!req.body.email){
subErrors.push({
name:"email",
reason:"login request must contain email"
})
}
if(!req.body.password){
subErrors.push({
name:"password",
reason:"login request must contain password"
})
}
const httpError = Errors.ValidationError(subErrors);
return next(httpError);
}
passport.authenticate('login', (err, user, info) =>{
if (err) {
return next(err);
}
if (!user) {
return next(info);
}
req.login(user,(err)=>{
if(err){
return next(err);
}
res.send({
success:true,
message:"logged in"
})
})
})(req, res, next);
});
由于最終目標是用我的自定義 http 錯誤替換護照的默認丟失憑據錯誤,并且我在 passportjs 策略中找不到方法,因此我在呼叫之前檢查了請求正文,passport.authenticate()
我可以成功創建并回傳我的自定義錯誤,但這意味著雖然我手動檢查,passportjs 還會檢查憑據是否存在。所以它不是性能的最佳選擇。
我也知道使用
if(x===null)
在某些情況下會導致一些問題,我還在原始代碼中使用了 '==' 而不是 '===' 。它與主要問題無關,但它不是最佳實踐。
最后是默認和自定義錯誤回應:
這是passportjs回傳的
{"message":"Missing credentials"}
這是我的自定義錯誤
{
"statusCode":400,
"error":"Bad Request",
"invalid_params":[
{
"name":"password",
"reason":"login request must contain password"
}
],
"type":"about:blank",
"title":"invalid parameters"}
我希望我能很好地解釋我想要達到的目標。現在這一切都按預期作業,但正如我所說的那樣,我正在檢查兩次相同的事情,所以任何更好的解決方案都值得贊賞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/424359.html
標籤:javascript 节点.js 验证 错误处理 护照.js