【问题标题】:nodejs passport authentication tokennodejs护照身份验证令牌
【发布时间】:2013-06-28 03:16:13
【问题描述】:

我正在编写一个 nodejs 应用程序,我想将它用作 Web 应用程序以及 API 提供程序。一旦用户通过身份验证,我想为该用户分配一个令牌以用于后续请求。这非常适用于 Web 应用程序的护照,因为我只是在会话中使用令牌序列化和反序列化用户。但是,在响应 API 请求时,没有设置 cookie 来存储会话信息。理想情况下,护照会在会话和请求正文中查找令牌。有没有办法配置护照来完成这个?

【问题讨论】:

    标签: node.js authentication express passport.js


    【解决方案1】:

    只需在每个请求上使用访问令牌。不需要使用会话。以下是工作流程:

    POST /signin
    
    1. 用户名和密码发布在客户端请求中。
    2. 服务器使用护照的本地策略对用户进行身份验证。见passport-local
    3. 如果凭据代表有效用户,则服务器返回某个生成器生成的访问令牌。 node-jwt-simple 是个不错的选择。
    4. 如果凭据无效,请重定向到/signin

    当客户端从授权服务器接收到访问令牌时,它就可以向服务器上的受保护资源发出请求。例如:

    GET /api/v1/somefunction?token='abcedf'

    1. 客户端使用令牌参数调用一些服务器 api。
    2. 服务器使用护照的承载策略对令牌进行身份验证。见passport-http-bearer

    参考文献

    Make a secure oauth API with passport.js and express.js (node.js)

    【讨论】:

    • 非常感谢您。出于某种原因,我认为 OAuth 需要比这更复杂。
    • 关于令牌生成,拥有一个永不过期的令牌是否安全?我必须使令牌过期并生成新令牌吗?
    • @giamfreeg 出于安全考虑,令牌应在一段时间后过期。
    • 很好的答案,但虽然不完全相关(很抱歉两年后发表评论!),您不应该在 GET 参数中传递令牌!有很多潜在的地方你可能会泄露它,并且不怀好意的人会抓住它。
    • 您说要使用 node-jwt-simple 进行加密。但是您跳过了为什么需要加密令牌以及如何验证令牌。您是否应该存储未加密的令牌但将加密的令牌传递回客户端?那么当一个加密令牌进来时,解密它,并验证解密后的令牌是否存在于数据库中?
    【解决方案2】:

    正如 bnuhero 所说,您不需要会话(尽管这种方法也有其优点)。这是我为此开始的样板项目: https://github.com/roblevintennis/passport-api-tokens

    这是一种替代方法,易于理解(但它确实使用会话)。可能是一个很好的交叉引用: http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local

    还有一个相关的参考: http://mherman.org/blog/2013/11/11/user-authentication-with-passport-dot-js/

    【讨论】:

      【解决方案3】:

      您可以在 nodejs 的护照中使用 isAuthenticated() 方法。在每条路线上,您都可以检查 if(req.isAuthenticated()) 如果它已经过身份验证,它将允许您访问该路线,或者您可以重定向或在 else 块中执行任何其他任何其他执行。在 Passport 中,您可以返回 done(null, user) 以成功登录,它会将数据存储在 cookie 中,直到会话结束。在用户中,您可以提供有关用户的信息,例如电子邮件、密码。

      app.get('/home', (req, res) =>{
          if(req.isAuthenticated()){
              //render home page
          } else {
              // go back to the login page or throw soome error
          }
      }) 
      

      【讨论】:

      • 这违背了使用像 Passport 这样的 Express 中间件的想法。不是一个干净或可维护的解决方案。
      猜你喜欢
      • 2019-05-21
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      相关资源
      最近更新 更多