我认为OAuth基本上是基于令牌的身份验证规范,但大部分时间框架都表现得好像它们之间存在差异。例如,如下图所示Jhipster询问是使用基于OAuth还是基于令牌的身份验证。
这些不一样吗?究竟有什么区别,因为两者都包含了实现中的令牌?
答案 0 :(得分:116)
这是一个很好的问题 - 围绕令牌和OAuth存在很多混淆。
首先,当你提到OAuth时,你可能会提到OAuth2 standard。这是OAuth协议的最新版本,也是大多数人在说“OAuth”时专门讨论的内容。
OAuth协议支持多种不同类型的身份验证和授权(准确地说是4)。
其次,OAuth协议的工作原理是通过令牌对用户进行身份验证。这里的想法是:
您不必让用户在每次请求时将实际凭据发送到您的服务器(就像使用Basic Auth一样,用户将每个请求的用户名/密码发送到服务器),您可以先使用OAuth交换用户“令牌”的凭据,然后根据此“令牌”对用户进行身份验证。
OAuth的想法是,要求用户通过网络传递其机密凭证的频率较低,可能会发生较少的不良后果。 (无论如何,这是个主意。)
现在,这里有令牌发挥作用:OAuth规范是围绕令牌的概念构建的,但没有指明令牌是什么。
在最“一般”的意义上,令牌只是一个唯一标识用户的字符串。就是这样。
人们意识到了这一点,并开发了一种创建令牌的新标准,称为JSON Web Token standard。该标准基本上提供了一组以非常特定的方式创建令牌的规则,这使得令牌对您来说更有用。
JWT允许您执行以下操作:
现在,在大多数情况下:开发社区中的每个人都同意,如果您使用任何类型的OAuth,那么您使用的令牌应该是JSON Web令牌。
==========
OK!现在我们已经介绍了背景故事,让我回答你的问题。
您在上面做出的选择是您是否要为身份验证/授权启用完整的OAuth2规范(这非常复杂),或者您是否只想要一些基本的“令牌身份验证”。
由于OAuth协议提供了多种不同的方式来以STANDARDS COMPLIANT方式进行身份验证,因此它为大多数身份验证系统增加了很多复杂性。
正因为如此,许多框架都提供了OAuth2密码授权流程的“愚蠢”版本,这本质上是一种简单的方法:
同样:上面的流程不符合OAuth,但是STILL使用令牌的版本稍微简单。
这里的要点是令牌(JWT)通常很有用,并且不需要与OAuth流配对。
我意识到这是一面文字,但希望它能更深入地回答你的问题=)
答案 1 :(得分:5)
当您从安全的Web服务请求资源时,您可以在呼叫上提供身份验证令牌。令牌行为充当"密码"用于访问资源。
OAuth只是特定类型的基于令牌的身份验证方法。
答案 2 :(得分:0)
OAuth 2.0是用于授权的规范,但不是用于验证的规范。 RFC 6749 3.1. Authorization Endpoint明确表示如下:
授权端点用于与资源所有者进行交互 并获得授权拨款。授权服务器必须首先 验证资源所有者的身份。的方式 授权服务器对资源所有者进行身份验证(例如,用户名 和密码登录,会话Cookie)已超出此范围 规范。
仅当您想授予对api的第三方服务的访问权限时,才使用OAuth。即使您使用的是OAuth,也需要某种身份验证(基于令牌或基于会话的身份验证)来对使用进行身份验证。 OAuth不适用于身份验证。
请参阅此question。