【发布时间】:2016-04-19 11:41:32
【问题描述】:
我认为 OAuth 基本上是基于令牌的身份验证规范,但大多数时候框架的行为似乎它们之间存在差异。例如,如下图所示,Jhipster 询问是使用基于 OAuth 的身份验证还是基于令牌的身份验证。
这些不是一回事吗?由于两者都在其实现中包含令牌,究竟有什么区别?
【问题讨论】:
标签: authentication oauth oauth-2.0 access-token jwt
我认为 OAuth 基本上是基于令牌的身份验证规范,但大多数时候框架的行为似乎它们之间存在差异。例如,如下图所示,Jhipster 询问是使用基于 OAuth 的身份验证还是基于令牌的身份验证。
这些不是一回事吗?由于两者都在其实现中包含令牌,究竟有什么区别?
【问题讨论】:
标签: authentication oauth oauth-2.0 access-token jwt
这是一个很好的问题——关于令牌和 OAuth 存在很多混淆。
首先,当您提到 OAuth 时,您可能指的是 OAuth2 standard。这是 OAuth 协议的最新版本,也是大多数人在说“OAuth”时专门谈论的内容。
OAuth 协议支持多种不同类型的身份验证和授权(准确地说是 4 种)。
其次,OAuth 协议通过令牌对用户进行身份验证来工作。这里的想法是这样的:
不是让您的用户在每次请求时都将他们的实际凭据发送到您的服务器(就像他们使用基本身份验证一样,用户在每次请求时将他们的用户名/密码发送到服务器),而使用 OAuth,您首先交换您的用户'token' 的凭据,然后根据此 'token' 对用户进行身份验证。
OAuth 的理念是,通过要求用户减少通过网络传递机密凭据的频率,可以减少坏事的发生。 (无论如何,这就是这个想法。)
现在,令牌在这里发挥作用:OAuth 规范是围绕令牌的概念构建的,但没有具体说明令牌是什么。
在最“一般”的意义上,令牌只是一个唯一标识用户的字符串。就是这样。
人们意识到了这一点,并开发了一种创建代币的新标准,称为JSON Web Token standard。该标准基本上提供了一组规则,用于以非常特定的方式创建令牌,这使得令牌对您更有用。
JWT 让您可以执行以下操作:
现在,在大多数情况下:开发社区中的几乎每个人都同意,如果您使用任何类型的 OAuth,那么您使用的令牌应该是 JSON Web 令牌。
===========
好的!现在我们已经介绍了背景故事,让我来回答您的问题。
您在上面所做的选择是您是否要启用完整的 OAuth2 规范以进行身份验证/授权(这非常复杂),或者您是否只是想要一些基本的“令牌身份验证”。
由于 OAuth 协议提供了多种不同的方式来以符合标准的方式进行身份验证,因此它为大多数身份验证系统增加了很多复杂性。
因此,许多框架都提供了 OAuth2 密码授予流程的“简化”版本,这本质上是一种简单的方法,其中:
再次重申:上面的流程不符合 OAuth,但它是一个稍微简单的版本,仍然使用令牌。
这里的重点是令牌 (JWT) 通常很有用,不需要与 OAuth 流程配对。
我知道这是一堵文字墙,但希望它能更深入地回答您的问题 =)
【讨论】:
当您从安全的 Web 服务请求资源时,您可以在调用时提供身份验证令牌。令牌充当访问资源的“密码”。
OAuth 只是特定类型的基于令牌的身份验证方法。
【讨论】:
OAuth 2.0 是授权规范,但不是身份验证规范。 RFC 6749,3.1. Authorization Endpoint 明确表示如下:
授权端点用于与资源所有者交互 并获得授权。授权服务器必须首先 验证资源所有者的身份。的方式 授权服务器对资源所有者进行身份验证(例如,用户名 和密码登录、会话 cookie)超出了此范围 规范。
仅当您想向您的 api 授予对第三方服务的访问权限时,才使用 OAuth。即使您使用 OAuth,您也需要某种身份验证(基于令牌或基于会话等)来验证使用。 OAuth 不是为身份验证而设计的。
看到这个question。
【讨论】: