【发布时间】:2013-12-25 15:35:29
【问题描述】:
我在服务器端使用 Node.js 和 Passportjs 的组合,在客户端使用 Emberjs 来开发应用程序。我目前的身份验证策略是使用 Passport-Local 以标准的电子邮件/密码组合对用户进行身份验证,然后挂钩会话创建机制以生成身份验证令牌,将其保存到单独的表中,并传回给用户用于任何进一步受保护的路线。 (在 REST 标头中传递)。
令牌的创建很好,我这样做没有问题,但是如果我需要额外的步骤,我正在努力解决。
目前,我使用随机的node-uuid 传递作为有效负载,并使用用户 UID(另一个 node-uuid)作为秘密来生成带有 node-jwt-simple 的令牌。然后,我将其保存到客户端的 $.cookie 和服务器端的表中,以及创建日期。
显然,node-jwt-simple 中的步骤之一是对令牌进行编码。还提供了解码功能。我的问题是,在进行身份验证检查时是否需要将令牌解码为某种东西,或者只是检查用户的会话 cookie(REST 标头)是否与数据库中的令牌匹配就足够了?我不想费尽心思去生成一个令牌,然后错过一个重要的步骤,但我不知道如何将它解码成任何可以提供任何额外有用安全性的东西。
更新:
我想我昨晚解决了这个问题:
解决方案似乎是使用用户的 UID 作为 JWT 的有效负载,使用静态字符串作为秘密(取自服务器环境变量或类似的东西),然后只将编码的令牌存储在数据库中。将令牌传回客户端进行重新验证,然后当客户端尝试访问受保护的路由时,他们必须将其 UID 与编码的令牌一起传递给服务器,然后对其进行解码,并将解码后的有效负载与 UID 进行比较已经通过了。如果它们匹配,则验证成功,否则令牌被销毁,用户必须重新登录。 通过这样做,在不知道密钥或拥有用户 UID 的情况下,令牌存储实际上变得无用,但使身份验证过程更加安全。
【问题讨论】:
标签: node.js authentication cookies ember.js jwt