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

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

【问题讨论】:

    标签: node.js express passport.js passport-local passport-jwt


    【解决方案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 端点
    猜你喜欢
    • 2022-07-30
    • 2021-10-13
    • 1970-01-01
    • 2014-03-24
    • 2021-07-15
    • 2020-01-19
    • 2018-12-13
    • 2018-03-08
    • 2017-01-26
    相关资源
    最近更新 更多