“passport”、“passport-local”和“passport-jwt”有啥区别? [关闭]

Posted

技术标签:

【中文标题】“passport”、“passport-local”和“passport-jwt”有啥区别? [关闭]【英文标题】:What is the difference between 'passport', 'passport-local' and 'passport-jwt'? [closed]“passport”、“passport-local”和“passport-jwt”有什么区别? [关闭] 【发布时间】:2020-11-10 15:58:19 【问题描述】:

我正在尝试学习 NodeJS,并在教程中看到这三个函数/类,但不明白它们是什么以及我们应该何时使用哪一个?

【问题讨论】:

【参考方案1】:

passport Passport 是 Node.js 的认证中间件。Passport 使用策略的概念来认证请求。策略包括验证用户名和密码凭据、使用 OAuth(例如,通过 Facebook 或 Twitter)的委托身份验证或使用 OpenID 的联合身份验证。

passport-local 本地身份验证策略使用用户名和密码对用户进行身份验证。该策略需要一个验证回调,它接受这些凭据并为用户提供完成的调用。

passport-jwt 此模块允许您使用 JSON Web 令牌对端点进行身份验证。它旨在用于保护没有会话的 RESTful 端点。

【讨论】:

我们应该在哪里使用它们中的哪一个? 因此,passport-jwt 可用于无需会话的安全 RESTful 端点,并且 passport-local 可用于在任何 Node.js 应用程序中使用用户名和密码进行身份验证。 passport-jwt: var opts = opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); opts.secretOrKey = '秘密'; opts.issuer = 'accounts.examplesoft.com'; opts.audience = 'yoursite.net'; passport.use(new JwtStrategy(opts, function(jwt_payload, done) User.findOne(id: jwt_payload.sub, function(err, user) if (err) return done(err, false); if (user) return done(null, user); else return done(null, false); // 或者你可以创建一个新帐户 ); )); passport-local: passport.use(new LocalStrategy( function(username, password, done) User.findOne( username: username , function (err, user) if (err) return done(err); if (!user) return done(null, false); if (!user.verifyPassword(password)) return done(null, false); return done(null, user); ); ));【参考方案2】:

Passport 是用于用户身份验证的 nodejs '连接样式中间件'。您最有可能将其视为Express 中间件。要使用护照,您需要使用passport 和定义您用于验证的“策略”。例如,这可能是 Facebook 或 Google 通过 oauth、SAML 或简单的 cookie。因此,要使用 Passport,您需要 require passport 模块本身相关的“策略”模块。

要使用“策略”,您可以使用策略构造函数来配置 passport。当您第一次遇到passport 时,文档中给出的“本地”示例有点迟钝,因此使用Google example 可能会更容易理解:

var passport = require('passport'); // passport
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; // Youa also need to import the Google 'strategy'

// configure passport to use the Google strategy by passing the GoogleStrategy constructor to passport.use()
passport.use(new GoogleStrategy(
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "http://www.example.com/auth/google/callback"
  ,
  function(accessToken, refreshToken, profile, done) 
       User.findOrCreate( googleId: profile.id , function (err, user) 
         return done(err, user);
       );
  
));

// now you can use passport.authenticate() with the google strategy
app.get('/auth/google',
  passport.authenticate('google',  scope: ['https://www.googleapis.com/auth/plus.login'] ));

// GET /auth/google/callback which Google send your user to after they authenticate using Oauth
app.get('/auth/google/callback', 
  passport.authenticate('google',  failureRedirect: '/login' ),
  function(req, res) 
    res.redirect('/');
  );

passport-local 是您针对存储在“本地”即应用程序数据库中的用户名和密码进行身份验证时使用的策略 - “本地”表示应用程序服务器的本地,不是最终用户本地的。

passport-jwt是使用JSON Web Tokens的策略。

【讨论】:

我们应该在哪里使用它们中的哪一个? 如果你想要一个系统让用户安全地登录到运行在 nodejs 上的 web 应用程序,你会使用 passport - 通常这很可能是一个 express 应用程序。你总是需要passport 加上 一个,这取决于你想要如何验证你的用户以及你是否想要存储他们的凭据。正如@divyani 在另一个答案中所说,JWT 通常用于 API 端点

以上是关于“passport”、“passport-local”和“passport-jwt”有啥区别? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?

req.session.passport 为空,未调用 deserializeUser - ExpressJS,Passport

Passport.authenticate 导出-> passport.authenticate(一些东西)(req,res,next)?

Google oauth20 的 Passport,未使用中间件,passport.initialize()

为啥我在使用 Passport 和会话时没有保持登录状态? Passport 的“isAuthenticated()”总是返回 false

对passport.use(strategy) done 功能及其与passport.authenticate 的关系感到困惑