我有一个使用JWT的无状态身份验证模型的新SPA。我经常被要求引用OAuth进行身份验证流程,比如要求我为每个请求发送“承载令牌”,而不是简单的令牌头,但我确实认为OAuth比简单的基于JWT的身份验证要复杂得多。主要的区别是什么,我应该让JWT身份验证像OAuth一样吗?

我还使用JWT作为我的XSRF- token来防止XSRF,但我被要求将它们分开?我应该把它们分开吗?这里的任何帮助都将受到感谢,并可能为社区提供一套指导方针。


当前回答

Jwt是一组用于发布和验证已签名访问令牌的严格指令。令牌包含应用程序用来限制用户访问的声明

OAuth2 on the other hand is not a protocol, its a delegated authorization framework. think very detailed guideline, for letting users and applications authorize specific permissions to other applications in both private and public settings. OpenID Connect which sits on top of OAUTH2 gives you Authentication and Authorization.it details how multiple different roles, users in your system, server side apps like an API, and clients such as websites or native mobile apps, can authenticate with each othe

注意oauth2可以与jwt一起工作,实现灵活,可扩展到不同的应用程序

其他回答

找出JWT和OAuth之间的主要区别

OAuth 2.0定义了一个协议,JWT定义了一个令牌格式。 OAuth既可以使用JWT作为令牌格式,也可以使用访问令牌作为承载令牌。 OpenID连接大多使用JWT作为令牌格式。

看起来每个回答这里的人都错过了OAUTH的关键

从维基百科

OAuth是一种访问授权的开放标准,通常用于互联网用户授权网站或应用程序访问他们在其他网站上的信息,但不提供密码谷歌、Facebook、微软和Twitter等公司都使用这种机制,允许用户与第三方应用程序或网站分享有关其账户的信息。

这里的关键点是访问委托。当存在基于id/pwd的身份验证时,为什么还要创建OAUTH呢?它由多因素身份验证(如otp)支持,并且可以通过用于保护路径访问(如OAUTH中的作用域)并设置访问过期的jwt进行保护

如果消费者只能通过他们信任的网站(或应用程序)访问他们的资源(您的端点),那么使用OAUTH就没有意义了,而这些网站又托管在您的端点上

只有当资源所有者(用户)希望通过第三方客户端(外部应用程序)访问他们(你的)资源(端点)时,你是OAUTH提供者,你才能进行OAUTH身份验证。它完全是为了同样的目的而创建的,尽管你可以滥用它

另一个重要提示: 对于JWT和OAUTH,您可以随意使用身份验证这个词,但它们都不提供身份验证机制。是的,一个是令牌机制,另一个是协议,但一旦经过身份验证,它们只用于授权(访问管理)。您必须使用OPENID类型身份验证或您自己的客户端凭据来支持OAUTH

OAuth 2.0定义了一个协议,即指定了令牌如何传输,JWT定义了令牌格式。

OAuth 2.0和“JWT身份验证”在客户端向资源服务器提供令牌的(第二)阶段具有类似的外观:令牌在头文件中传递。

但是“JWT身份验证”不是一个标准,并且没有指定客户端首先如何获得令牌(第一阶段)。这就是OAuth复杂性的来源:它还定义了客户端从所谓的授权服务器获取访问令牌的各种方式。

因此,真正的区别在于JWT只是一种令牌格式,OAuth 2.0是一种协议(可以使用JWT作为令牌格式)。

Firstly, we have to differentiate JWT and OAuth. Basically, JWT is a token format. OAuth is an authorization protocol that can use JWT as a token. OAuth uses server-side and client-side storage. If you want to do real logout you must go with OAuth2. Authentication with JWT token can not logout actually. Because you don't have an Authentication Server that keeps track of tokens. If you want to provide an API to 3rd party clients, you must use OAuth2 also. OAuth2 is very flexible. JWT implementation is very easy and does not take long to implement. If your application needs this sort of flexibility, you should go with OAuth2. But if you don't need this use-case scenario, implementing OAuth2 is a waste of time.

XSRF令牌总是在每个响应头中发送给客户端。CSRF令牌是否在JWT令牌中发送并不重要,因为CSRF令牌本身是安全的。因此,在JWT中发送CSRF令牌是不必要的。

博士TL; 如果您有非常简单的场景,比如单个客户端应用程序,单个API,那么使用OAuth 2.0可能并不值得。另一方面,如果有很多不同的客户端(基于浏览器的、本地移动的、服务器端等),那么坚持OAuth 2.0规则可能比尝试使用自己的系统更容易管理。


正如在另一个回答中所述,JWT(学习JSON Web令牌)只是一种令牌格式。它定义了一个紧凑且自包含的机制,用于在各方之间以一种可验证和可信的方式传输数据,因为它是数字签名的。此外,JWT的编码规则也使这些令牌在HTTP上下文中非常容易使用。

它们是自包含的(实际令牌包含关于给定主题的信息),也是实现无状态身份验证机制(又名Look mum, no session !)的好选择。在走这条路线时,一方要被授予对受保护资源的访问权,必须提供的唯一东西就是令牌本身,而所讨论的令牌可以称为不记名令牌。

在实践中,您所做的事情已经可以归类为基于不记名令牌的。但是,请考虑您没有使用OAuth 2.0相关规范指定的不记名令牌(请参阅RFC 6750)。这意味着依赖于Authorization HTTP报头并使用承载身份验证方案。

关于使用JWT来防止CSRF:在不知道确切细节的情况下,很难确定这种做法的有效性。说实话,这似乎不正确和/或不值得。下面的文章(cookie vs .令牌:最终指南)可能是关于这个主题的有用读物,特别是XSS和XSRF保护部分。

最后一条建议。即使您不需要完全使用OAuth 2.0,我也强烈建议您在授权标头中传递访问令牌,而不是使用自定义标头。如果它们确实是不记名代币,请遵循RFC 6750的规则。如果不是,您总是可以创建一个自定义身份验证方案,并仍然使用该报头。

授权标头由HTTP代理和服务器识别和特殊处理。因此,使用这样的头向资源服务器发送访问令牌,通常可以减少泄漏或意外存储经过身份验证的请求的可能性,特别是授权头。

(来源:RFC 6819,章节5.4.1)