智威汤逊与OAuth身份validation
我有一个使用JWT的无状态身份validation模型的新SPA。 我经常被要求引用OAuth进行authenticationstream程,例如要求我为每个请求发送“承载令牌”,而不是简单的令牌标头,但我认为OAuth比简单的基于JWT的authentication要复杂得多。 主要的区别是什么?我应该让JWTauthentication像OAuth一样吗?
我也使用JWT作为我的XSRF-TOKEN来防止XSRF,但是我被要求将它们分开? 我应该让他们分开吗? 任何帮助在这里将不胜感激,可能会导致一个社区的指导方针。
TL; DR如果你有非常简单的场景,比如单个客户端应用程序,单个API,那么OAuth 2.0可能不会成功,另一方面,许多不同的客户端(基于浏览器的,原生移动的,服务器端等等),那么坚持OAuth 2.0规则可能使它更容易pipe理,然后试图滚动自己的系统。
正如另一个答案所述,JWT( 学习JSON Web Tokens )只是一种令牌格式,它定义了一种紧凑的自包含机制,用于在各方之间传输数据,因为它是数字签名的,因此可以validation和可信。 另外,JWT的编码规则也使这些令牌在HTTP的上下文中非常容易使用。
自给自足(实际的令牌包含关于给定主题的信息),它们也是实现无状态身份validation机制(又名妈妈,没有会话! )的好select。 当走这条路线时,一方必须提供访问被保护资源的唯一东西就是令牌本身,这个令牌可以被称为不记名令牌。
在实践中,你正在做的事情已经被分类为基于不记名的令牌。 但是,请考虑您不使用OAuth 2.0相关规范中指定的承载令牌(请参阅RFC 6750 )。 这意味着,依靠Authorization
HTTP头和使用Bearer
authenticationscheme。
关于使用JWT来防止CSRF不知道确切的细节,很难确定这种做法的有效性,但说实话,这似乎不正确和/或值得。 下面的文章( Cookies和Tokens:权威指南 )可能是一个有用的阅读这个问题,特别是XSS和XSRF保护部分。
一个最后的build议,即使你不需要完整的OAuth 2.0,我强烈build议在Authorization
头中传递你的访问令牌,而不是使用自定义头 。 如果他们真的是不记名的令牌遵循RFC 6750的规则,如果不是,你总是可以创build一个自定义的身份validationscheme,仍然使用该头。
授权头被HTTP代理和服务器识别和特别处理。 因此,这种用于向资源服务器发送访问令牌的头部的使用通常减less了authentication请求的泄漏或意外存储的可能性,特别是授权头部。
(来源: RFC 6819,第5.4.1节 )
OAuth 2.0定义了一个协议,即指定如何传递令牌,JWT定义了一个令牌格式。
当客户端向资源服务器展示令牌的第二阶段,OAuth 2.0和“JWTauthentication”具有相似的外观:令牌在标头中传递。
但是“JWTauthentication”不是一个标准,也没有规定客户如何获得令牌(第一阶段)。 这就是OAuth所感知的复杂性的来源:它还定义了客户端可以从称为授权服务器的某种东西获得访问令牌的各种方式。
所以真正的区别是JWT只是一种令牌格式,OAuth 2.0是一种协议( 可能使用JWT作为令牌格式)。
首先,我们必须区分智威汤逊和OAuth。 基本上,JWT是一种令牌格式。 OAuth是可以使用JWT作为标记的authentication框架。 OAuth具有服务器端和客户端存储。 如果你想做真正的注销,你必须使用OAuth2。 使用JWT令牌进行身份validation实际上无法注销。 因为你没有保存跟踪令牌的authentication服务器。 如果您想为第三方客户端提供API,则还必须使用OAuth2。 OAuth2有很多灵活性。 智威汤逊的实施过于简单,实施起来也不需要很长时间。 如果您的应用程序需要某种灵活性,则必须使用OAuth2。 但是如果你不需要这个用例场景,那么实现OAuth2只是浪费时间。
XSRF令牌总是在服务器的每个响应头中发送给客户端。 无关紧要,CSRF令牌是否在JWT令牌中发送。 因为CSRF令牌是自己保护的。 因此在JWT中发送CSRF令牌是不必要的。
看起来每个人在这里回答都错过了OAUTH的争论点
从维基百科
OAuth是访问授权的开放标准,通常被用来作为互联网用户授权网站或应用程序访问其他网站上的信息的方式,但不给他们提供密码[1]。 Google,Facebook,Microsoft和Twitter等公司使用这种机制,允许用户与第三方应用程序或网站共享有关其帐户的信息。
这里的关键是access delegation
。 为什么任何人在有基于id / pwd的身份validation时都会创buildOAUTH,并由像OTP这样的多重身份validation提供支持,还可以通过用于保护对path的访问的JWT来保护(例如OAUTH中的作用域),并设置访问
如果消费者只能通过他们信任的网站(或应用程序)来访问他们的资源(您的terminal),那么您再也不能使用OAUTH
只有在资源所有者(用户)希望通过第三方客户端(外部应用程序)访问他们(您的)资源(端点)的情况下,您才能进入OAUTHauthentication。 它也是为了同样的目的而创build的,尽pipe你可能会滥用它
另一个重要说明:
您可以自由使用JWT和OAUTH的单词authentication
,但不提供身份validation机制。 一个是令牌机制,另一个是协议,但一旦通过authentication,它们只用于授权(访问pipe理)。 您必须使用OPENIDtypesauthentication或您自己的客户端凭证来备份OAUTH
JWT(JSON Web Tokens) – 这只是一种令牌格式。 JWT令牌是JSON编码的数据结构,包含关于发行者,主题(声明),到期时间等的信息。它被签名以防篡改和真实性,并且可以使用对称或非对称方法对其进行encryption以保护令牌信息。 JWT比SAML 1.1 / 2.0简单,并且受到所有设备的支持,比SWT(Simple Web Token)更强大。
OAuth2 – OAuth2解决用户想要使用客户端软件访问数据的问题,例如基于浏览的Web应用程序,原生移动应用程序或桌面应用程序。 OAuth2仅用于授权,可以授权客户端软件使用访问令牌代表最终用户访问资源。
OpenID Connect – OpenID Connectbuild立在OAuth2之上并添加authentication。 OpenID Connect为OAuth2添加一些约束,如UserInfo端点,ID令牌,OpenID Connect提供程序的发现和dynamic注册以及会话pipe理。 JWT是令牌的强制格式。
CSRF保护 – 如果您不将令牌存储在浏览器的Cookie中,则不需要实施CSRF保护。
- REST API授权和authentication(网页+手机)
- 保护API:SSL和HTTP基本身份validation与签名
- Symfony 2:我如何检查用户是否没有login模板?
- 什么是最好的分布式蛮力对策?
- 什么端口需要打开svn乌龟进行身份validation(明文)和提交
- 在GitHub API上使用带有用户名和密码的Invoke-WebRequest进行基本authentication
- Django Rest框架中的用户authentication+ Angular.js Web应用程序
- configurationSpring Security 3.x有多个入口点
- 何时通过Facebook的新Android SDK 3.0请求权限?