问题标签 [json-web-token]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
413 浏览

angularjs - 保管箱。在 Web 存储中存储访问令牌

我正在使用 AngularJs 开发 SPA,它将与 Dropbox API 一起使用。我需要将保管箱访问令牌保存在网络存储或 cookie 中,但我不确定它是否安全。

是否有安全存储访问令牌的机制?

谢谢。

0 投票
1 回答
144 浏览

jwt - 您可以使用 express-jwt 签署令牌,因为它似乎主要关注 JWT 的验证吗?

我正在使用一个快速应用程序,我想实现基于令牌的身份验证我想知道我主要在客户端和服务器端需要哪些库?我查看了 express-jwt 我没有看到该库实际上可以签署 Web 令牌,但我可以清楚地看到它用于验证,所以我的 package.json 中也需要 node-jsonwebtoken 吗?在客户端,我在想像 jwt-decode 之类的东西?

0 投票
3 回答
953 浏览

node.js - nodejs - JSONWebToken 过期问题

我正在尝试使用 Json Web 令牌(在本文的帮助下)对我的 nodejs api 进行身份验证,但问题是令牌永不过期。

0 投票
4 回答
24395 浏览

javascript - 无法为 JWT 正确设置 Exp 和 Iat

我有点被这个难住了。我正在尝试设置一个有效的 JWT。我正在使用带有 jsonwebtoken 中间件的 node.js。我遵循了位于 repo 上的文档(位于此处),但我一直得到错误的 Exp 和 Iat。显然,我想做到这一点,这样我就不允许 JWT 已经过期。

作为测试,我有以下代码:

这个的输出是:

如何让时间戳不反映 javascript 纪元,而是反映 1 小时后的时间?(对于 iat 和 exp。)

0 投票
1 回答
1267 浏览

node.js - 使用 nodejs 应用程序上的刷新和访问令牌了解身份验证流程

我知道已经有很多关于 Oauth、Oauth2、JWT 等的帖子。我已经阅读了很多,而且我比以往任何时候都更加困惑,所以我正在寻找一些澄清。我将提出我对这个主题的看法,我希望有人能告诉我我的实现是否足够安全,或者我做错了什么以及如何改进它。

我正在构建一个 API Rest 服务器来为我的用户提供我的资源。假设它是一个银行应用程序,用户可以在其中存款、取款和转账。

我正在为我的服务器使用 nodejs、hapijs、jsonwebtokens 和 bcrypt。我想实现两个令牌认证流程(Oauth2)。

这就是我这样做的方式:

  1. 用户通过提供一些凭据(用户名和密码)登录到身份验证服务器。

  2. 服务器验证用户的凭据,如果它们有效,它将授予用户访问权限并返回一个刷新令牌和一个访问令牌。

    • 这些令牌被保存到浏览器或移动设备的本地存储中。

    • access token: _

      • 被签名为 jsonwebtoken。
      • 包含发布日期、到期日期(5 分钟)、用户数据(id、用户名)。
    • refresh token: _

      • 被签名为 jsonwebtoken 并使用 bcrypt 加密。
      • 包含唯一标识符
      • 可能包含到期日期
      • 保存在数据库中。
  3. 只要access token是有效的,即它没有过期并且包含有效的用户数据,资源服务器就会为用户提供所请求的资源。

  4. access token不再有效时,身份验证服务器请求客户端提供一个refresh token以便发出一个新的access token

    • 服务器refresh token从用户那里接收,解密它,将它与数据库中的比较,检查它是否已被撤销,并检查它的唯一标识符。
    • 如果refresh token通过了所有测试,则服务器向客户端发出一个新access token的。
    • 如果refresh token未通过一项测试,则服务器请求用户重新认证。

注意:我试图避免使用 cookie。

问题:

  • 如果用户能偷一个access token,我猜它也能偷的refresh token。那么,我怎样才能使refresh token更安全呢?
  • 我对 Oauth2 流程的看法是否正确?
  • 我可以改进什么?
  • 我错过了什么吗?
0 投票
1 回答
127 浏览

node.js - 当我们不再使用它时,为 json web token 设置无效

我正在使用JsonWebToken为用户进行身份验证。当用户登录时,我为用户创建一个令牌。然后用户更新他们的信息,我为用户创建一个新令牌。如何为以前的令牌设置无效?例如:将过期日期更改为现在或其他......

0 投票
2 回答
61 浏览

javascript - 在 http 请求中包含 Web 令牌

我正在使用 ajax 调用在成功时返回一个 json Web 令牌。来自 jwt.io 之类的网站有很多信息,然后您应该将您的 http 请求标头更新为“Authorization Bearer 'token'”,但我不知道该怎么做。我使用 ajaxSetup() 更新后续的 ajax 调用,但它不是单页应用程序,因此我将在之后使用标准的 http 获取和发布。我没有使用任何框架,如 Backbone 或 Angular。谢谢!

0 投票
1 回答
1293 浏览

node.js - 在nodejs中使用json web token一次只允许一次登录

我目前正在使用 json Web 令牌对服务器上的用户进行身份验证。现在我希望用户在任何给定时间都应该只有一个活动登录。正如在stackoverflow上的一些其他答案中提到的那样,这可以通过将生成的 json Web 令牌存储在数据库表中并在每次用户登录服务器时更新此令牌来轻松完成。每当对用户进行身份验证时,我所要做的就是检查数据库中的令牌。我正在考虑另一种方法。由于我使用的是 json Web 令牌,因此我可以为不同的用户使用不同的秘密并将它们存储在数据库中,而不是存储整个令牌。每当用户登录时,这些秘密都会更新。因此,在任何时候都只有一个秘密,并且由于任何秘密的用户只能解码一个令牌(当然在这种情况下),因此只有一个登录将处于活动状态。我想知道这两种方法中哪一种更好。对不同的用户有不同的秘密可以吗?

0 投票
3 回答
3425 浏览

ruby-on-rails - 使用 JWT 和刷新令牌对移动应用程序进行身份验证

目前,我开始为此烦恼。过去几天我做了一些研究,似乎我不太明白如何实现以下目标:

我目前正在使用移动应用程序作为客户端在 Rails 中构建一个 API。移动应用程序可以是 iOS 或 Android。现在我正在努力进行身份验证。客户端登录设备后,我发出一个短期过期的 JWT。因此,如果令牌过期,客户端需要重新登录,这在我的情况下是不可接受的用户体验。无论如何,我觉得我需要有某种过期,以防止令牌被盗后永远使用。

现在我想知道如何集成刷新令牌。如何确保用户只能使用已颁发给此确切设备的有效刷新令牌来获得新的访问令牌?还是我让事情变得过于复杂并分配一个可以在所有设备上使用的刷新令牌就可以了?

更新:我查看了支持密码授予流程的门卫 gem。但是门卫处理令牌的方式是,它将每个生成的访问令牌与相应的刷新令牌一起存储在数据库中。当令牌被撤销或刷新时,旧的访问令牌会失效——随着时间的推移,这将增长到一个巨大的数据库表。

此外,我更喜欢使用 JWT 作为令牌,因此我不必在数据库中存储刷新令牌以外的任何内容。以下过程是否安全?

  1. 用户使用用户名/密码请求访问令牌 - 假设是设备名称。
  2. 服务器发出 JWT 并为当前设备创建一个刷新令牌。
  3. 服务器存储刷新令牌。
  4. 当访问令牌过期时,用户使用它的刷新令牌请求一个新令牌。
  5. 服务器验证刷新令牌并发出新的访问令牌。此外,刷新令牌将替换为新令牌。

我对此的问题:用户可以在多个设备上登录,如何区分它们?

0 投票
1 回答
807 浏览

node.js - generateJWT 不是函数

我正在尝试使 facebook 登录成为可能:

这是我的 API 路线:

当用户第一次使用 facebook 登录时,会存储用户并使用 jsonwebtoken 生成令牌。

但是,当该 fb 帐户中已有用户时,它会给我错误:

TypeError: foundUser.generateJWT 不是函数

为什么会这样?generateJWT 对新用户有效,但对找到的用户无效?

我编辑了我的 API 路由:

在邮递员中使用时,它会返回一个符合预期的令牌。

但是当我在生产模式下使用它时,我得到一个 500 内部服务器错误。