问题标签 [express-jwt]

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 回答
623 浏览

angularjs - 无状态 REST 服务器上的 Google API 回调

我们正在运行一个典型的 MEAN 设置 - Angular 用于前端渲染,node.js (express) 作为服务器。静态 HTML/Javascript 资产从节点提供,无需身份验证。前端显示的所有数据都是 Angular 从节点请求的。Angular 通过在 ajax 请求的“授权”标头中提供不记名 JWT 令牌来针对节点端点授权用户。

这非常有效,但是当涉及到此设置中的 Google API OAuth2 集成时,我处于死胡同。目标是在 webapp 中显示用户的日历数据:

  1. Angular 从在请求标头中提供不记名令牌的节点请求/api/calendars
  2. 如果服务器还没有该用户的 Google 访问令牌,它会创建一个 Google 令牌请求 URL(包括 callbackUrl /api/calendars/googleCallback )并将其发送回 Angular。
  3. 当 Angular 收到一个 tokenRequest-Url 作为响应而不是日历数据时,它会将用户重定向到这个 URL,在那里他手动授予 webapp 权限。
  4. Google 重定向到提供访问代码的回调 URL。

问题是第 4 步 - 因为节点服务器是无状态的,并且从 Google 到/api/calendars/googleCallback?code=XYZ的重定向不包含服务器无法识别的授权标头,更不用说验证提供的访问代码所属的用户了。

由于 Google 只接受预先指定的固定回调 URL,因此向回调 URL 动态添加某种标识用户的哈希是行不通的(而且似乎很不安全)。我可以将用户标识存储在 cookie 中,但这感觉就像违反了整个 JWT 方法。

问题是,如果上述流程通常是一个坏主意,或者是否有最佳实践来处理这种情况,以允许后端识别回调请求属于哪个用户。

谢谢!

0 投票
1 回答
543 浏览

node.js - 在 express-jwt 中是否有任何类似于 req.isAuthenticated() 的方式选项类似于 passportjs?

我想找出用户是否在中间件中通过了“jwt”的身份验证。有没有类似于passportjs的req.isAuthenticated()方法?

0 投票
7 回答
166847 浏览

security - 如果您可以解码 JWT,它们的安全性如何?

如果我得到一个JWT并且我可以解码有效负载,那么它的安全性如何?难道我不能从标头中获取令牌,解码并更改有效负载中的用户信息,然后使用相同的正确编码秘密将其发回吗?

我知道它们必须是安全的,但我真的很想了解这些技术。我错过了什么?

0 投票
2 回答
3130 浏览

security - JsonWebToken:基于活动的过期与发布基于时间的过期

我对基于令牌的授权相当陌生。我试图找出自定义过期/令牌刷新方案中的缺陷。

我在 Express API 中有一个基本的 JWT 身份验证设置;我将 JWT 到期时间设置为 1 小时;但是,JWT 会检查相对于令牌发布时间的令牌过期时间。我希望在每次成功的 api 调用后重置过期时间。如果我的用户正在积极使用该应用程序超过一个小时,我不希望他们必须重新登录以刷新令牌(并且可能会丢失他们正在处理的任何数据。)

另一方面,如果令牌超过一个小时没有响应,我确实希望令牌过期。

我想出了以下方法:

在每个成功的 API 请求期间,发出一个新的 JWT 并将其发送到自定义响应标头中。我的客户端代码负责检查此 JWT 响应标头并将其值用作新的默认授权请求标头。因此,如果超过 1 小时没有来自用户的 API 请求,则令牌将过期并且不会被刷新。然后需要登录。此外,将存储令牌的原始发行日期(登录身份验证的时间戳),以便在 24 小时后强制执行令牌的“硬过期”。

这看起来相当简单且相当安全,但我在 JWT 研究中没有看到任何提及它的内容。有没有更好的方法来实现相同的目标?我是否错过了这种方法的主要安全漏洞?

更新: 在考虑了一段时间后,我意识到这样做的问题是它打开了重放无法被令牌过期阻止的攻击的大门。所以绝对应该有一个“硬到期”检查:硬到期将使令牌在发行日期后的某个时间失效,无论最近的用户活动如何。

0 投票
3 回答
6230 浏览

node.js - 使用 express-jwt,为什么我的授权标头明显存在时丢失

我正在使用 express-jwt 和 jsonwebtoken。

当我尝试使用 jsonwebtoken.verify() 时,我收到此错误:

我可以看到 req.headers.authorization 令牌存在,因为我正在注销它。所以我不明白如果标题明显存在,为什么标题会丢失。

任何帮助表示赞赏。这是要点:
https ://gist.github.com/ryanore/914362881d2d9f0878f2

这是 req.headers.authorization 的 console.log 输出

0 投票
1 回答
181 浏览

security - JWT 在未经身份验证的端点上进行 CSRF 保护?

我有很多 api 端点,我想保护它们免受 CSRF 的影响。我想以无状态的方式做到这一点,所以自然会想到 JWT。

问题是,这些端点不需要用户登录。

所以,我的问题是,我可以使用 JWT,但我无法在服务器端验证令牌——我没有可以匹配的登录用户。

在这种情况下有什么方法可以使用 JWT 吗?

0 投票
1 回答
992 浏览

angularjs - expressJwt:在不需要登录的页面上访问 req.user

我正在使用 expressJwt ( https://github.com/auth0/express-jwt ) 对 angularjs 网站进行用户验证。我有一个有趣的情况,我有一个 URL(/username/somedata),任何人都可以访问这个页面。如果他们没有登录,或者不是这个用户,他们只会得到标记为公开的数据。如果他们已登录并且是正确的用户,他们将获得公共和私人数据。

问题是您只能在以 /api (需要登录)开头的任何路径上从 req.user 访问 JWT(json Web 令牌)......并且由于此页面不需要登录,因此它不会下降在 /api 下。

有什么方法可以允许访问不在 /api 下的路径上的 req.user 吗?另一个想法是在请求数据并使用不同的路径之前检查他们是否已登录......

IE:

未登录始终使用:/username/somedata(始终只公开数据)

已登录:/api/username/somedata(在输出之前检查用户是否是数据的作者,如果作者输出公共和私人......否则也只有公共)

更新:我测试了多条路径,效果很好,但我仍然很好奇你是否可以通过另一种方式访问​​ req.user,所以我现在不打算回答我自己的问题。

0 投票
1 回答
5386 浏览

node.js - 即使在浏览器关闭后如何记住用户使用 jwt?

我正在尝试在我的 expressjs、nodejs 和 angularjs 应用程序中使用 jsonwebtoken 和 express-jwt 为我的用户身份验证实现 json Web 令牌。我阅读了各种文章和教程,现在我对某些事情感到有些困惑。

首先我对 JWT 的理解是它由三个部分组成,以句点分隔:

  1. 标头:描述 jwt 和算法。
  2. Payload:包含信息:发行者、受众、到期
  3. Signature:基于header和payload的签名

因此,每个请求都是使用令牌发出的,该令牌在服务器上进行验证。根据这篇文章,发行人是提出请求的人。在用户认证的情况下,用户是颁发者。现在使用express-jwt中间件,验证请求标头中的令牌并将解码的令牌附加到 req.user:

有效载荷的长度可以是多长?以及如何以及在何处将令牌保存在客户端,以便即使在浏览器关闭后我的会话仍然存在,除非用户注销,例如 Facebook 的“保持登录”?因为我不希望在令牌过期时提示用户再次登录,所以我希望令牌更新,除非用户注销。

0 投票
2 回答
5146 浏览

angularjs - 我的身份验证令牌拦截器不拦截新路由的请求/响应

我正在尝试为我的 nodejs、express 和 angularjs 应用程序实现 jwt 身份验证。到目前为止,我已经生成了令牌,并将其存储在我的localStorage. 根据教程,我实现了authInterceptor角度工厂如下:

我已将拦截器推送到配置文件中,如下所示:

到目前为止,我已经将凭据发送到服务器,生成了令牌并将其存储在localStorage.

所以只要我没有从localStorage中删除令牌,并且令牌没有过期,我认为它应该是持久的。如果我使用 angularjs 的后台 ajax 调用从加载的页面中发出请求,则会按预期设置身份验证标头。

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYSIsInR5cGUiOiJzYWxlcyIsImlhdCI6MTQyMjI2MDExMCwiZXhwIjoxNDIyMjc4MTEwfQ.Iv6W-Tc8Qm4FGclzmgbtjvWFz_tyDwEvrFmMmucONpY

但是,当我导航到新路线时,我的请求和响应都不会被拦截。例如,我有我的“/销售”路线。但是当我从地址栏导航到销售路线时,拦截器没有设置请求认证头,因此从服务器返回授权错误401,也没有被拦截;因此不会重定向到/dash.

这是错误的链接,以及对未经授权的路由“/sales”的 GET 请求的标头: 401 错误的请求和响应标头

0 投票
1 回答
616 浏览

node.js - express-jwt 通过路由处理特定的秘密密码

这是我的用例。

在我使用 express-jwt 模块的快递应用程序中,我有 2 条主线路。我想用 2 个不同的密码来保护我的路线。

在这种情况下,它不像我预期的那样工作......有没有办法在一个快递应用程序中实现这一目标?

提前感谢您的帮助!