OAuth 2.0 和 OpenID Connect 中的 JWT 安全性

Posted

技术标签:

【中文标题】OAuth 2.0 和 OpenID Connect 中的 JWT 安全性【英文标题】:JWT security in OAuth 2.0 and OpenID Connect 【发布时间】:2019-11-05 15:02:46 【问题描述】:

我决定加入潮流并开始使用 OAuth 2.0 和 OpenID Connect 来为我的下一个项目进行身份验证和授权,但我很难理解 JWT 的安全性。

我使用 Angular 8 作为前端,带有 node.js 后端,Auth0 作为我的身份服务提供者(我知道这是错误的术语。忘记了。)

我已经观看了两到三门关于这些主题的 PluralSight 课程,但没有一个真正在 node.js 后端使用 JWT,他们主要集中在 .NET 堆栈上,我猜这会花费大量精力.

我的问题是:如何确定发送到我的 API 的 JWT 令牌是来自 Auth0 的令牌?我知道令牌有一个签名,我想 Auth0 有一些他们用来签署 JWT 的私人秘密,但是什么是为了防止一些恶意实体创建一个内容完全相同的 JWT 并使用不同的秘密签名并将其发送到我的 API?在我看到的 .NET 示例中,我没有看到检查签名的秘密是否对应于 Auth0 的内容。需要对 API(.NET、node.js 或其他)进行哪些检查以确保 JWT 是真实的?

这将如何与 nodejs 一起工作?

【问题讨论】:

【参考方案1】:

我不确定我是否理解正确或什么,但 JWT 由相同的秘密签名和验证(如果使用 HMAC 算法),所以你的第一个问题的答案是:

如果它被篡改,您将在验证期间收到通知,因为使用不同的密钥签名会泄露令牌已被盗用。

不确定您使用的是什么库,但对于 Node.js,jsonwebtoken package 有一个 jwt.verify(token, secret) 函数,它将您的令牌和秘密值作为参数.这基本上就是您需要并且可以进行验证的全部内容。

【讨论】:

这听起来很合适,感谢您忍受我的术语问题。我猜从你所说的,我需要知道签署 JWT 的秘密?这是公开的吗?例如,使用 Auth0 实现的 OAuth 2.0 和 OpenID Connect,我可以访问此密钥吗? 好的,在 Auth0 网站上稍作查看后,我发现我确实可以访问该密钥,因此我对 JWT 的安全性感到相当满意!谢谢@Lukas 另外,我不确定您的设置,但如果可能,请尝试将令牌存储在 HTTP cookie 中,以防止 XSS 攻击。这是更多详细信息的链接Where to Store your JWTs@serlingpa

以上是关于OAuth 2.0 和 OpenID Connect 中的 JWT 安全性的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0 和 OpenID Connect 中的 JWT 安全性

OAuth 2.0 与 OpenID Connect 协议的完整指南

OpenId Connect 问题 - 授权代码流 (OAuth 2.0)

使用带有 C# 的 Google OAuth 2.0 登录

使用带有 C# 的 Google OAuth 2.0 登录

OAuth 2.0安全案例回顾