基于 OAuth 和基于令牌的身份验证有什么区别?
What is the difference between OAuth based and Token based authentication?
我认为 OAuth 基本上是一种基于令牌的身份验证规范,但大多数时候框架表现得好像它们之间存在差异。例如,如下图所示 Jhipster 询问是使用基于 OAuth 还是基于令牌的身份验证。
这不是一回事吗?究竟有什么区别,因为两者都在其实现中包含令牌?
当您从安全网络服务请求资源时,您可以在调用时提供身份验证令牌。令牌充当 "secret code" 用于访问资源。
OAuth 只是一种特定类型的基于令牌的身份验证方法。
这是一个很好的问题——关于令牌和 OAuth 存在很多混淆。
首先,当您提到 OAuth 时,您可能指的是 OAuth2 standard。这是 OAuth 协议的最新版本,也是大多数人在说 'OAuth'.
时特别谈论的内容
OAuth 协议支持多种不同类型的身份验证和授权(准确地说是 4 种)。
其次,OAuth 协议通过令牌对用户进行身份验证来工作。这里的想法是这样的:
不是让您的用户在每次请求时都将他们的实际凭据发送到您的服务器(就像他们使用 Basic Auth,用户在每次请求时将他们的 username/password 发送到服务器),而使用 OAuth 您首先将您的用户凭据交换为 'token',然后根据此 'token'.
对用户进行身份验证
OAuth 的想法是,通过要求用户减少通过网络传递机密凭据的频率,可以减少坏事的发生。 (无论如何,这就是想法。)
现在,这里是令牌发挥作用的地方:OAuth 规范是围绕令牌的概念构建的,但没有具体说明什么是令牌。
在大多数 'general' 意义上,令牌只是唯一标识用户的字符串。就是这样。
人们意识到了这一点,并开发了一种用于创建令牌的新标准,称为 JSON Web Token standard。该标准基本上提供了一组以非常具体的方式创建令牌的规则,这使得令牌对您通常更有用。
JWT 可让您执行以下操作:
- 对令牌进行加密签名,这样您就知道令牌没有被用户篡改。
- 加密令牌,使内容无法以纯文本形式读取。
- 以标准方式在令牌字符串中嵌入 JSON 数据。
现在,在大多数情况下:开发社区中几乎每个人都同意,如果您使用任何类型的 OAuth,那么您使用的令牌应该是 JSON Web 令牌。
==========
好的!现在我们已经介绍了背景故事,让我回答你的问题。
您在上面做出的选择是您是否要为身份验证/授权启用完整的 OAuth2 规范(这非常复杂),或者您是否只需要一些基本的 'token authentication'.
因为 OAuth 协议提供了多种不同的方式来以符合标准的方式进行身份验证,这给大多数身份验证系统增加了很多复杂性。
因此,许多框架提供了 'dumbed down' 版本的 OAuth2 密码授予流程,本质上是一个简单的方法,其中:
- 用户将他们的 username/password 发送到您的服务器 URL 例如 /login。
- 您的服务器为用户生成 JWT 令牌。
- 你的服务器returns给用户的令牌。
- 用户将此令牌存储在他们的 cookie、移动设备或可能的 API 服务器中,他们在其中使用它来发出请求。
再次说明:上面的流程不符合 OAuth,但它是一个稍微简单的版本,仍然使用令牌。
这里的要点是令牌 (JWT) 通常很有用,不需要与 OAuth 流程配对。
我知道这是一堵文字墙,但希望它能更深入地回答您的问题 =)
OAuth 是授权而非认证的规范
OAuth 2.0 是授权规范,而不是身份验证规范。 RFC 6749,3.1. Authorization Endpoint 明确表示如下:
The authorization endpoint is used to interact with the resource owner
and obtain an authorization grant. The authorization server MUST first
verify the identity of the resource owner. The way in which the
authorization server authenticates the resource owner (e.g., username
and password login, session cookies) is beyond the scope of this
specification.
仅当您想要为您的 api 提供对第三方服务的访问权限时才使用 OAuth。即使您使用 OAuth,您也需要某种身份验证(基于令牌或基于会话等)来验证使用。 OAuth 不是为身份验证而设计的。
看到这个。
我认为 OAuth 基本上是一种基于令牌的身份验证规范,但大多数时候框架表现得好像它们之间存在差异。例如,如下图所示 Jhipster 询问是使用基于 OAuth 还是基于令牌的身份验证。
这不是一回事吗?究竟有什么区别,因为两者都在其实现中包含令牌?
当您从安全网络服务请求资源时,您可以在调用时提供身份验证令牌。令牌充当 "secret code" 用于访问资源。
OAuth 只是一种特定类型的基于令牌的身份验证方法。
这是一个很好的问题——关于令牌和 OAuth 存在很多混淆。
首先,当您提到 OAuth 时,您可能指的是 OAuth2 standard。这是 OAuth 协议的最新版本,也是大多数人在说 'OAuth'.
时特别谈论的内容OAuth 协议支持多种不同类型的身份验证和授权(准确地说是 4 种)。
其次,OAuth 协议通过令牌对用户进行身份验证来工作。这里的想法是这样的:
不是让您的用户在每次请求时都将他们的实际凭据发送到您的服务器(就像他们使用 Basic Auth,用户在每次请求时将他们的 username/password 发送到服务器),而使用 OAuth 您首先将您的用户凭据交换为 'token',然后根据此 'token'.
对用户进行身份验证OAuth 的想法是,通过要求用户减少通过网络传递机密凭据的频率,可以减少坏事的发生。 (无论如何,这就是想法。)
现在,这里是令牌发挥作用的地方:OAuth 规范是围绕令牌的概念构建的,但没有具体说明什么是令牌。
在大多数 'general' 意义上,令牌只是唯一标识用户的字符串。就是这样。
人们意识到了这一点,并开发了一种用于创建令牌的新标准,称为 JSON Web Token standard。该标准基本上提供了一组以非常具体的方式创建令牌的规则,这使得令牌对您通常更有用。
JWT 可让您执行以下操作:
- 对令牌进行加密签名,这样您就知道令牌没有被用户篡改。
- 加密令牌,使内容无法以纯文本形式读取。
- 以标准方式在令牌字符串中嵌入 JSON 数据。
现在,在大多数情况下:开发社区中几乎每个人都同意,如果您使用任何类型的 OAuth,那么您使用的令牌应该是 JSON Web 令牌。
==========
好的!现在我们已经介绍了背景故事,让我回答你的问题。
您在上面做出的选择是您是否要为身份验证/授权启用完整的 OAuth2 规范(这非常复杂),或者您是否只需要一些基本的 'token authentication'.
因为 OAuth 协议提供了多种不同的方式来以符合标准的方式进行身份验证,这给大多数身份验证系统增加了很多复杂性。
因此,许多框架提供了 'dumbed down' 版本的 OAuth2 密码授予流程,本质上是一个简单的方法,其中:
- 用户将他们的 username/password 发送到您的服务器 URL 例如 /login。
- 您的服务器为用户生成 JWT 令牌。
- 你的服务器returns给用户的令牌。
- 用户将此令牌存储在他们的 cookie、移动设备或可能的 API 服务器中,他们在其中使用它来发出请求。
再次说明:上面的流程不符合 OAuth,但它是一个稍微简单的版本,仍然使用令牌。
这里的要点是令牌 (JWT) 通常很有用,不需要与 OAuth 流程配对。
我知道这是一堵文字墙,但希望它能更深入地回答您的问题 =)
OAuth 是授权而非认证的规范
OAuth 2.0 是授权规范,而不是身份验证规范。 RFC 6749,3.1. Authorization Endpoint 明确表示如下:
The authorization endpoint is used to interact with the resource owner and obtain an authorization grant. The authorization server MUST first verify the identity of the resource owner. The way in which the authorization server authenticates the resource owner (e.g., username and password login, session cookies) is beyond the scope of this specification.
仅当您想要为您的 api 提供对第三方服务的访问权限时才使用 OAuth。即使您使用 OAuth,您也需要某种身份验证(基于令牌或基于会话等)来验证使用。 OAuth 不是为身份验证而设计的。
看到这个