OAuth Authorization vs Authentication

OAuth 术语已经困扰我很长时间了。OAuth 授权是否如某些人所建议的那样,或者是否为身份验证?

如果我错了请纠正我,但我一直认为授权是允许某人访问资源的行为,但 OAuth 似乎没有任何实现,实际上允许用户访问给定的资源。OAuth 实现所讨论的都是向用户提供一个令牌(已签名,有时是加密的)。然后,每次对后端服务端点的调用都会传递这个令牌,并在其中检查它的有效性,同样不是 OAuth 关注的问题。

Is OAuth Authentication (every article says it isn't) which I take it requires a user to provide credentials which in turn proves a user should/shouldn't have access?

因此,看起来 OAuth 不是 Authorization NOR Authentication,因为这些必须由其他进程执行。那到底是什么?它是一个通信令牌的过程吗?难道这个词真的没有什么特别的意思吗?

关于这个问题很难提出一个听起来不神秘和迷信的问题(鬼和妖精) ,所以我希望回答这个问题也不会是一件简单的事情。进来后自担风险。

49884 次浏览

OAuth 是一种授权规范

OAuth 2.0 is a specification for authorization, but NOT for authentication. RFC 6749, 3.1授权端点 explicitly says as follows:

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


OAuth 认证?

身份验证处理关于“某人是谁”的信息。授权处理有关“谁向谁授予什么权限”的信息。授权流包含身份验证作为其第一步。这就是人们经常感到困惑的原因。

有许多库和服务使用 OAuth 2.0进行身份验证。它通常被称为“社会登录”,它使人们更加困惑。如果您看到“ OAuth 身份验证”(而不是“ OAuth 授权”) ,它是使用 OAuth 进行身份验证的解决方案。


OpenID Connect

OpenID 1.0 and OpenID 2.0 are old specifications for authentication. Those who made the specifications expected people to use OpenID for authentication. However, some people began to use OAuth 2.0 for authentication (not for authorization) and OAuth authentication has prevailed rapidly.

从 OpenID 的角度来看,基于 OAuth 的身份验证不够安全,但是他们不得不承认人们更喜欢 OAuth 身份验证。因此,OpenID 决定在 OAuth 2.0之上定义一个新的规范 OpenID Connect

Yes, this has made people much more confused.


OAuth 2.0和 OpenID Connect 的一句话定义

OAuth 2.0 是一个框架,在这个框架中,服务的用户可以允许第三方应用程序访问其托管在服务中的数据,而无需向应用程序披露其凭据(ID 和密码)。

enter image description here

OpenID Connect 是 OAuth 2.0之上的一个框架,第三方应用程序可以在其中获得由服务管理的用户身份信息。

enter image description here

(对不起,这些定义摘自我公司的 概述页面)


从实现者的角度定义

身份验证 是一个确定最终用户主题(= 唯一标识符)的过程。确定主题的方法有很多种。身份证及密码、指纹、虹膜识别等。

Authorization 是将主题与请求的权限和请求权限的客户端应用程序关联的过程。访问令牌表示关联。


参见

  1. OAuth 和 OpenID Connect 的完全从头开始实现者谈论调查结果
  2. 所有 OAuth 2.0流程的图表和电影
  3. 所有 OpenID 连接流程图
  4. OAuth 2.0最简单的指南

OAuth 是一种授权协议。它不是为身份验证而设计的。是的,OAuth 过程中有一个步骤,其中身份服务器对资源所有者进行身份验证。它发生的方式不属于 OAuth 协议。这就是 OAuth 不关心身份验证的原因。

OAuth 通过向第三方(服务提供商)提供访问令牌来执行授权,该第三方将能够通过显示令牌来授权对资源的访问。

假设服务提供者需要代表资源所有者访问资源(由标识服务器保护)。因此,资源所有者将首先进行身份验证,然后授予服务提供者访问特定资源的权限。然后,标识服务器将为服务提供者发出访问令牌。稍后,服务提供者可以使用该令牌访问资源。

在这里,OAuth 不关心谁携带访问令牌或试图访问资源。它验证访问令牌,并允许第三方访问资源。