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

我认为 OAuth 基本上是一种基于令牌的身份验证规范,但是大多数时候框架的作用就好像它们之间有区别一样。例如,如下图所示,嬉皮士询问是使用基于 OAuth 还是基于令牌的身份验证。

这不是一回事吗? 既然两者的实现都包含令牌,那么它们之间到底有什么区别呢?

enter image description here

41958 次浏览

当您从受保护的 Web 服务请求资源时,您可以在调用中提供身份验证令牌。令牌充当访问资源的“秘密代码”。

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

这是一个很好的问题——关于令牌和 OAuth 有很多混淆。

首先,当您提到 OAuth 时,您可能指的是 OAuth2标准。这是 OAuth 协议的最新版本,也是大多数人在提到“ OAuth”时特别谈论的内容。

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

其次,OAuth 协议通过令牌对用户进行身份验证:

OAuth 不是让用户在每次请求时向服务器发送他们的实际凭证(就像 Basic Auth 那样,用户为每个请求向服务器发送他们的用户名/密码) ,而是先将用户凭证交换为一个“令牌”,然后根据这个“令牌”对用户进行身份验证。

OAuth 的思想是,通过要求用户不那么频繁地通过网络传递他们的机密凭证,可能会发生不那么糟糕的事情。(不管怎样,这就是我的想法。)

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

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

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

JWTs 允许你这样做:

  • 对令牌进行加密签名,以便您知道令牌没有被用户篡改。
  • 加密令牌,以便无法以纯文本读取内容。
  • 以标准方式嵌入标记字符串的 JSON 数据 INSIDE。

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


好了,现在我们已经讲完了背景故事,让我来回答你的问题。

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

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

因此,很多框架都提供了 OAuth2 Password Grant 流程的“简化”版本,这实际上是一个简单的方法,其中包括:

  • 用户将他们的用户名/密码发送到您的服务器上的某个 URL,如/login。
  • 您的服务器为用户生成一个 JWT 令牌。
  • 服务器将该令牌返回给用户。
  • 用户将此令牌存储在 Cookie、移动设备或可能的 API 服务器中,用于发出请求。

再次强调: 上面的流不兼容 OAuth,但是它是一个稍微简单一点的版本,STILL 使用令牌。

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

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

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

OAuth 2.0是授权规范,但不是身份验证规范:

授权端点用于与资源所有者交互 并获得授权。授权服务器必须首先 验证资源所有者的标识 授权服务器对资源所有者进行身份验证(例如,用户名 和密码登录,会话 cookie)是 < strong > 超出了这个范围 规范 .

只有在您想要向您的 API 提供对第三方服务的访问时才使用 OAuth。即使在使用 OAuth 时,也需要某种身份验证(基于令牌或基于会话等)来对使用进行身份验证。OAuth 不是为身份验证而设计的。

看看这个 有个问题