基于OAuth和基于令牌的身份验证之间有什么区别?

时间:2016-01-14 08:19:40

标签: authentication oauth oauth-2.0 access-token jwt

我认为OAuth基本上是基于令牌的身份验证规范,但大部分时间框架都表现得好像它们之间存在差异。例如,如下图所示Jhipster询问是使用基于OAuth还是基于令牌的身份验证。

这些不一样吗?究竟有什么区别,因为两者都包含了实现中的令牌?

enter image description here

3 个答案:

答案 0 :(得分:116)

这是一个很好的问题 - 围绕令牌和OAuth存在很多混淆。

首先,当你提到OAuth时,你可能会提到OAuth2 standard。这是OAuth协议的最新版本,也是大多数人在说“OAuth”时专门讨论的内容。

OAuth协议支持多种不同类型的身份验证和授权(准确地说是4)。

其次,OAuth协议的工作原理是通过令牌对用户进行身份验证。这里的想法是:

您不必让用户在每次请求时将实际凭据发送到您的服务器(就像使用Basic Auth一样,用户将每个请求的用户名/密码发送到服务器),您可以先使用OAuth交换用户“令牌”的凭据,然后根据此“令牌”对用户进行身份验证。

OAuth的想法是,要求用户通过网络传递其机密凭证的频率较低,可能会发生较少的不良后果。 (无论如何,这是个主意。)

现在,这里有令牌发挥作用:OAuth规范是围绕令牌的概念构建的,但没有指明令牌是什么。

在最“一般”的意义上,令牌只是一个唯一标识用户的字符串。就是这样。

人们意识到了这一点,并开发了一种创建令牌的新标准,称为JSON Web Token standard。该标准基本上提供了一组以非常特定的方式创建令牌的规则,这使得令牌对您来说更有用。

JWT允许您执行以下操作:

  • 以密码方式签署令牌,以便您知道某个令牌未被用户篡改。
  • 加密令牌,因此无法以纯文本格式阅读内容。
  • 以标准方式嵌入标记字符串的JSON数据INSIDE。

现在,在大多数情况下:开发社区中的每个人都同意,如果您使用任何类型的OAuth,那么您使用的令牌应该是JSON Web令牌。

==========

OK!现在我们已经介绍了背景故事,让我回答你的问题。

您在上面做出的选择是您是否要为身份验证/授权启用完整的OAuth2规范(这非常复杂),或者您是否只想要一些基本的“令牌身份验证”。

由于OAuth协议提供了多种不同的方式来以STANDARDS COMPLIANT方式进行身份验证,因此它为大多数身份验证系统增加了很多复杂性。

正因为如此,许多框架都提供了OAuth2密码授权流程的“愚蠢”版本,这本质上是一种简单的方法:

  • 用户通过某些网址(例如/ login。)将他们的用户名/密码发送到您的服务器。
  • 您的服务器为该用户生成JWT令牌。
  • 您的服务器将该令牌返回给用户。
  • 用户将此令牌存储在其Cookie,移动设备或可能的API服务器中,用于发出请求。

同样:上面的流程不符合OAuth,但是STILL使用令牌的版本稍微简单。

这里的要点是令牌(JWT)通常很有用,并且不需要与OAuth流配对。

我意识到这是一面文字,但希望它能更深入地回答你的问题=)

答案 1 :(得分:5)

当您从安全的Web服务请求资源时,您可以在呼叫上提供身份验证令牌。令牌行为充当"密码"用于访问资源。

OAuth只是特定类型的基于令牌的身份验证方法。

答案 2 :(得分:0)

OAuth是用于授权而非身份验证的规范

OAuth 2.0是用于授权的规范,但不是用于验证的规范。 RFC 6749 3.1. Authorization Endpoint明确表示如下:

  

授权端点用于与资源所有者进行交互   并获得授权拨款。授权服务器必须首先   验证资源所有者的身份。的方式   授权服务器对资源所有者进行身份验证(例如,用户名   和密码登录,会话Cookie)已超出此范围   规范。

仅当您想授予对api的第三方服务的访问权限时,才使用OAuth。即使您使用的是OAuth,也需要某种身份验证(基于令牌或基于会话的身份验证)来对使用进行身份验证。 OAuth不适用于身份验证。

请参阅此question