OAuth是一种授权协议,它允许第三方服务代表资源所有者访问受保护的资源。授权与身份验证不同,因为身份验证是验证用户身份的过程,而授权是验证用户有权访问的过程。因此,OAuth是允许服务代表用户相互访问的标准服务。
OAuth提供委托访问。可以使用代客密钥示例解释此概念。在许多酒店中,客户可以将车钥匙交给代客泊车。为了防止盗窃,某些汽车带有代客钥匙,但这种代步工具的通行性有所降低。在此示例中,代客服务需要访问汽车服务,为此,客户只能通过代客密钥提供所需的服务子集。这表示委派的访问。
图:通过Google,Facebook登录,后者使用OAuth授权第三方服务访问用户数据。
因此,OAuth是用于访问委派的开放标准,通常用作Internet用户向网站或应用程序授予对其他网站上其信息的访问权限的方式,而无需给他们提供密码。
OAuth的元素:
为了描述OAuth中涉及的元素,我们选择了可以使用OAuth的示例场景。考虑到在线照片打印服务的客户需要功能,该功能允许打印服务直接从其Google相册帐户获取用户照片。为了实现这种功能,简单的方法将涉及打印服务,要求用户为其Google帐户提供登录凭据。这种方法显然是非常不安全的,因为用户无法信任可以访问其整个Google帐户的打印服务。这就是OAuth的用武之地。
用于描述OAuth系统中参与者/元素的术语是:
- 资源–
它表示要由第三方服务访问的数据。在我们的示例中,“用户照片”代表资源。 - 资源所有者–
资源所有者是资源的实际所有者。对于我们的方案,照片的原始所有者是资源所有者。 - 客户 –
客户端代表第三方服务,该服务要求代表资源所有者访问资源。在我们的示例中,照片打印服务是客户端。 - 资源服务器–
它代表安全存储资源的服务器。在我们的示例中,照片托管在充当资源服务器的Google服务器上。 - 授权服务器(Auth Server)–
为了实施OAuth协议,拥有资源服务器的实体(即Google)必须提供一个额外的服务器,因为Google托管资源并具有安全负担。
代替在资源服务器本身上提供Auth Server的功能,而是使用单独的服务器来减轻资源服务器上不必要的过载。
OAuth流程:
OAuth流程按以下方式进行:
- 资源所有者要求客户提供服务,在我们的情况下,是打印照片。
- 客户端与AuthServer联系以请求资源,即Google服务器上的照片。AuthServer会以提示登录窗口的形式向Google的资源所有者发送提示,询问其从客户端收到的请求。
- 用户确认客户端请求的服务,并代表客户端向Auth Server授予授权。这提供了对客户端的委派访问。
- Auth Server收到资源所有者的授权请求。
- 在对资源所有者进行身份验证和确认后,Auth Server会向客户端发送访问令牌,以允许其访问资源服务器上托管的必需资源。
- 客户端向资源服务器提供访问令牌。
- 在验证访问令牌后,将资源提供给客户端。
- 最后,用户可以访问客户端的服务,该服务可以代表用户访问受保护的资源。
上面详述的流程称为“隐式流程” 。在某些OAuth流程中,不是直接向客户端提供访问令牌,而是由Auth Server向客户端提供中间授权令牌。要访问资源,客户端需要首先向Auth Server提供授权令牌,然后请求访问令牌。这样的OAuth流称为授权码流。
直接提供访问令牌(隐式流程)的缺点是未经授权的各方可能会使用访问令牌。授权代码流更安全,因为可以使用授权令牌来保护访问令牌交换的机制。
隐式流更适合JavaScript应用程序使用的短期访问令牌。