对身份验证技术的怀疑 - 护照

Posted

技术标签:

【中文标题】对身份验证技术的怀疑 - 护照【英文标题】:Doubts on Authentication Techniques - Passport 【发布时间】:2021-03-08 13:00:36 【问题描述】:

因此,我在 express 服务器上尝试了 passportpassport-jwt 的身份验证技术。这是我一直在使用的代码

const JwtStrategy = require("passport-jwt").Strategy;
const ExtractJwt = require("passport-jwt").ExtractJwt;
const User = require("../models/user");
const opts = ;
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = "secret";
module.exports = passport => 
    passport.use(
        new JwtStrategy(opts, (jwt_payload, done) => 
            User.findById(jwt_payload.id,(err,user)=>
                if(err)
                    return done(err,false);
                
                if(user)
                    done(null,user);
                
                else
                    done(null,false);
                
            )
        )
    )
;

所以使用这个护照授权的全部意义在于尽量减少访问数据库的次数,对吧?

但是在提取令牌后的这段代码中,通过findById方法访问数据库以查找用户是否在数据库中,那么如果在每次认证请求期间都访问数据库,那么这一切有什么意义呢?

我很确定我说错了,非常感谢您帮助澄清这个问题。

【问题讨论】:

重点是-“Node.js 的简单、不显眼的身份验证”。查询次数不是最重要的优化。 你是在暗示? 【参考方案1】:

问题是,为什么需要在中间件上做User.findById

您无需访问中间件上的数据库即可从 JWT 有效负载中查找用户是否存在。当用户通过/login端点获取jwt时,你应该已经检查过用户是否存在

// just a logic example on the login enpoint

const user = User.findUserByEmail(req.body.email);
if (!user) res.sendStatus(401); //returns 401 if user not found
else 
    if (verifyPassword(req.body.password, password)) 
        res.send(generatedJwtWithUserIdOnThePayload)
     else 
        res.sendStatus(401); //returns 401 if password invalid
    

登录到客户端时传递的 jwt 中已经有有效的用户 ID,因此您不需要每次客户端向您的其他端点发送请求时都从 User.findById 获取 User 文档。

由于用户 ID 已经在负载中,除非您需要来自 User 文档的用户 ID 之外的其他数据,否则您实际上不需要在中间件上执行 User.findById

【讨论】:

好的,解决了,我发布的代码在很多例子中被广泛看到,这就是我关注它的原因。谢谢顺便说一句。

以上是关于对身份验证技术的怀疑 - 护照的主要内容,如果未能解决你的问题,请参考以下文章

使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向

使用电子邮件进行身份验证时,NestJS 护照身份验证返回 401

本地护照和本地护照猫鼬的身份验证错误

Sails.js 与护照-http-bearer 身份验证不起作用

未知的身份验证策略护照

node.js中护照身份验证后如何发送json作为响应