authentication jwt使用 - 智威汤逊与OAuth身份验证




jwt框架 java实现 (6)

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

我也使用JWT作为我的XSRF-TOKEN来防止XSRF,但我被要求将它们分开? 我应该让他们分开吗? 这里的任何帮助将不胜感激,并可能为社区提供一套指导方针。


Answers

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

另一方面OAuth2不是一个协议,它是一个委托授权框架。 认为非常详细的指导原则,让用户和应用程序在私人和公共设置中授予对其他应用程序的特定权限。 位于OAUTH2之上的OpenID Connect为您提供身份验证和授权,详细了解您的系统中多个不同角色,用户,API等服务器端应用程序以及网站或本机移动应用程序之类的客户端如何进行身份验证

注意 oauth2可以使用jwt,灵活的实现,可以扩展到不同的应用程序


TL; DR如果您有非常简单的场景,比如单个客户端应用程序,单个API,那么OAuth 2.0可能无法实现,另一方面,许多不同的客户端(基于浏览器,本机移动,服务器端等等),那么坚持使用OAuth 2.0规则可能会比试图滚动自己的系统更易于管理。

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

自包含(实际的令牌包含关于给定主题的信息),它们也是实现无状态身份验证机制(又名妈妈,没有会话! )的好选择。 当走这条路线时,派对必须具有的唯一权限才能被授予对受保护资源的访问权限,这个令牌本身可以被称为不记名令牌。

在实践中,你正在做的事情可以被分类为基于持票人令牌。 但是,请考虑您不使用OAuth 2.0相关规范中指定的承载令牌(请参阅RFC 6750 )。 这意味着,依靠Authorization HTTP头和使用Bearer认证方案。

关于如何在不知道确切详情的情况下使用JWT预防CSRF,很难确定这种做法的有效性,但说实话,这似乎并不正确和/或值得。 下面的文章( Cookies与令牌:权威指南 )可能是一个有用的阅读,尤其是XSS和XSRF保护部分。

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

授权标头被HTTP代理和服务器识别并特别处理。 因此,使用这种用于向资源服务器发送访问令牌的头部通常会降低被认证的请求的泄漏或意外存储的可能性,特别是授权头。

(来源: RFC 6819,第5.4.1节


看起来像这里回答的每个人都错过了OAUTH的争论点

从维基百科

OAuth是访问委派的开放标准,通常用于互联网用户授予网站或应用程序访问其他网站上的信息的权限,但不给他们提供密码。[1] Google,Facebook,Microsoft和Twitter等公司使用这种机制,允许用户与第三方应用程序或网站共享有关其帐户的信息。

这里的关键是access delegation 。 为什么任何人在有基于id / pwd的身份验证时都会创建OAUTH,并由像OTP这样的多重身份验证提供支持,还可以通过用于保护对路径的访问的JWT进行保护(如OAUTH中的作用域)并设置访问

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

只有在资源所有者(用户)希望通过第三方客户端(外部应用程序)访问他们(您的)资源(端点)的情况下,您才可以进行OAUTH认证 它完全是为了同样的目的而创建的,尽管你可以一般地滥用它

另一个重要说明:
您可以为JWT和OAUTH自由使用单词authentication ,但都不提供身份验证机制。 是的,一种是令牌机制,另一种是协议,但一旦通过认证,它们仅用于授权(访问管理)。 您必须使用OPENID类型认证或您自己的客户端凭证来备份OAUTH


首先,我们必须区分智威汤逊和OAuth。 基本上,JWT是一种令牌格式。 OAuth是一个可以使用JWT作为标记的认证框架。 OAuth使用服务器端和客户端存储。 如果你想做真正的注销,你必须使用OAuth2。 使用JWT令牌进行身份验证不能实际注销。 因为你没有一个跟踪令牌的认证服务器。 如果您想为第三方客户端提供API,则还必须使用OAuth2。 OAuth2非常灵活。 JWT的实施非常简单,实施起来并不需要很长时间。 如果您的应用程序需要这种灵活性,您应该使用OAuth2。 但是如果你不需要这种用例场景,那么实现OAuth2是浪费时间。

XSRF令牌始终在每个响应头中发送到客户端。 CSRF令牌是否在JWT令牌中发送并不重要,因为CSRF令牌是自己保护的。 因此在JWT中发送CSRF令牌是不必要的。


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

当客户端向资源服务器展示令牌的第二阶段时,OAuth 2.0和“JWT认证”具有相似的外观:令牌传递到头部。

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

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


JWT(JSON Web令牌) - 这只是一种令牌格式。 JWT令牌是JSON编码的数据结构,包含关于发行者,主题(声明),到期时间等的信息。它被签名以防篡改和真实性,并且可以使用对称或非对称方法对其进行加密以保护令牌信息。 JWT比SAML 1.1 / 2.0简单,并且受所有设备支持,并且它比SWT(简单Web令牌)更强大。

OAuth2 - OAuth2解决了用户想要使用客户端软件(如基于浏览的Web应用程序,原生移动应用程序或桌面应用程序)访问数据的问题。 OAuth2仅用于授权,客户端软件可以被授权使用访问令牌代表最终用户访问资源。

OpenID Connect - OpenID Connect基于OAuth2构建并添加身份验证。 OpenID Connect为OAuth2添加一些约束,如UserInfo端点,ID令牌,OpenID Connect提供程序的发现和动态注册以及会话管理。 JWT是令牌的强制格式。

CSRF保护 - 如果您不将令牌存储在浏览器的Cookie中,则不需要实施CSRF保护。

你可以在这里阅读更多细节http://proficientblog.com/microservices-security/





authentication oauth jwt jjwt