📜  通过OAuth 2.0跨服务授权

📅  最后修改于: 2021-08-25 10:07:35             🧑  作者: Mango

OAuth是一种授权协议,它允许第三方服务代表资源所有者访问受保护的资源。授权与身份验证不同,因为身份验证是验证用户身份的过程,而授权是验证用户有权访问的过程。因此,OAuth是允许服务代表用户相互访问的标准服务。

OAuth提供委托访问。可以使用代客密钥示例解释此概念。在许多酒店中,客户可以将车钥匙交给代客泊车。为了防止盗窃,某些汽车带有代客钥匙,但这种代步工具的通行性有所降低。在此示例中,代客服务需要访问汽车服务,为此,客户只能通过代客密钥提供所需的服务子集。这表示委派的访问。

图:通过Google,Facebook登录,后者使用OAuth授权第三方服务访问用户数据。

因此,OAuth是用于访问委派的开放标准,通常用作Internet用户向网站或应用程序授予对其他网站上其信息的访问权限的方式,而无需给他们提供密码。

OAuth的元素:
为了描述OAuth中涉及的元素,我们选择了可以使用OAuth的示例场景。考虑到在线照片打印服务的客户需要功能,该功能允许打印服务直接从其Google相册帐户获取用户照片。为了实现这种功能,简单的方法将涉及打印服务,要求用户为其Google帐户提供登录凭据。这种方法显然是非常不安全的,因为用户无法信任可以访问其整个Google帐户的打印服务。这就是OAuth的用武之地。

用于描述OAuth系统中参与者/元素的术语是:

  1. 资源–
    它表示要由第三方服务访问的数据。在我们的示例中,“用户照片”代表资源。
  2. 资源所有者–
    资源所有者是资源的实际所有者。对于我们的方案,照片的原始所有者是资源所有者。
  3. 客户 –
    客户端代表第三方服务,该服务要求代表资源所有者访问资源。在我们的示例中,照片打印服务是客户端。
  4. 资源服务器–
    它代表安全存储资源的服务器。在我们的示例中,照片托管在充当资源服务器的Google服务器上。
  5. 授权服务器(Auth Server)–
    为了实施OAuth协议,拥有资源服务器的实体(即Google)必须提供一个额外的服务器,因为Google托管资源并具有安全负担。

代替在资源服务器本身上提供Auth Server的功能,而是使用单独的服务器来减轻资源服务器上不必要的过载。

OAuth流程:

OAuth流程按以下方式进行:

  1. 资源所有者要求客户提供服务,在我们的情况下,是打印照片。
  2. 客户端与AuthServer联系以请求资源,即Google服务器上的照片。AuthServer会以提示登录窗口的形式向Google的资源所有者发送提示,询问其从客户端收到的请求。
  3. 用户确认客户端请求的服务,并代表客户端向Auth Server授予授权。这提供了对客户端的委派访问。
  4. Auth Server收到资源所有者的授权请求。
  5. 在对资源所有者进行身份验证和确认后,Auth Server会向客户端发送访问令牌,以允许其访问资源服务器上托管的必需资源。
  6. 客户端向资源服务器提供访问令牌。
  7. 在验证访问令牌后,将资源提供给客户端。
  8. 最后,用户可以访问客户端的服务,该服务可以代表用户访问受保护的资源。

上面详述的流程称为“隐式流程” 。在某些OAuth流程中,不是直接向客户端提供访问令牌,而是由Auth Server向客户端提供中间授权令牌。要访问资源,客户端需要首先向Auth Server提供授权令牌,然后请求访问令牌。这样的OAuth流称为授权码流。

直接提供访问令牌(隐式流程)的缺点是未经授权的各方可能会使用访问令牌。授权代码流更安全,因为可以使用授权令牌来保护访问令牌交换的机制。

隐式流更适合JavaScript应用程序使用的短期访问令牌。