OAuth 2.0授权
当客户端应用程序想要访问托管在资源服务器上的资源所有者的资源时,客户端应用程序必须首先获得"授权授予"。本文解释了如何获得这样的申请授权。
客户端ID,客户端机密和重定向URI
在客户端应用程序可以请求访问资源服务器上的资源之前,客户端应用程序必须首先向与资源服务器关联的授权服务器注册。
注册通常是一次性任务。一旦注册,除非客户端应用程序注册被吊销,否则注册仍然有效。
在注册时,授权服务器为客户端应用程序分配了客户端ID和客户端密钥(密码)。客户端ID和密码对于该授权服务器上的客户端应用程序是唯一的。如果客户端应用程序向多个授权服务器(例如Facebook,Twitter和Google)注册,则每个授权服务器将向客户端应用程序发布其自己的唯一客户端ID。
每当客户端应用程序请求访问存储在同一资源服务器上的资源时,客户端应用程序就需要通过将客户端ID和客户端密钥一起发送到授权服务器来对其自身进行身份验证。
在注册过程中,客户端还将注册重定向URI。当资源所有者向客户端应用程序授予授权时,将使用此重定向URI。当资源所有者已通过授权服务器成功授权了客户端应用程序时,资源所有者将被重定向回客户端应用程序,即重定向URI。
授权许可
资源所有者与与资源服务器关联的授权服务器合作,将授权授予授予客户端应用程序。
OAuth 2.0规范列出了四种不同类型的授权授予。每种类型都有不同的安全性特征。授权授予类型为:
- 授权码
- 隐含的
- 资源所有者密码凭证
- 客户凭证
以下各节介绍了每种授权授权类型。
授权码
使用授权码的授权授权的工作方式如下(数字对应于说明下方图表中显示的步骤):
1)资源所有者(用户)访问客户端应用程序。
2)客户端应用程序告诉用户通过授权服务器(例如Facebook,Twitter,Google等)登录到客户端应用程序。
3)要通过授权服务器登录,客户端应用程序会将用户重定向到授权服务器。客户端应用程序将其客户端ID一起发送到授权服务器,因此授权服务器知道哪个应用程序正在尝试访问受保护的资源。
4)用户通过授权服务器登录。成功登录后,询问用户是否要授予其对客户端应用程序资源的访问权限。如果用户接受,则将用户重定向回客户端应用程序。
5)当重定向回客户端应用程序时,授权服务器将用户发送到特定的重定向URI,客户端应用程序已提前在该重定向URI中注册了该应用程序。授权服务器连同重定向一起发送代表授权的授权代码。
6)当访问客户端应用程序中的重定向URI时,客户端应用程序直接连接到授权服务器。客户端应用程序将授权代码连同其自己的客户端ID和客户端机密一起发送。
7)如果授权服务器可以接受这些值,则授权服务器将发回访问令牌。
10)客户端应用程序现在可以使用访问令牌从资源服务器请求资源。访问令牌既充当客户端,资源所有者(用户)的身份验证,又充当访问资源的授权。
隐式授权
隐式授权许可与授权代码授权类似,不同之处在于访问令牌已在用户完成授权后返回给客户端应用程序。因此,当用户代理重定向到重定向URI时,将返回访问令牌。
当然,这意味着访问令牌可在用户代理或者参与隐式授权授予的本机应用程序中访问。访问令牌没有安全地存储在Web服务器上。
此外,客户端应用程序只能将其客户端ID发送到授权服务器。如果客户端也要发送其客户端机密,则客户端机密也必须存储在用户代理或者本机应用程序中。那将使其容易受到黑客攻击。
隐式授权授予通常在用户代理或者本机客户端应用程序中使用。用户代理或者本机应用程序将从授权服务器接收访问令牌。
资源所有者密码凭证
资源所有者密码凭据授权授予方法通过向客户端应用程序授予对资源所有者凭据的访问来工作。例如,用户可以在客户端应用程序中输入其Twitter用户名和密码(凭据)。然后,客户端应用程序可以使用用户名和密码来访问Twitter中的资源。
使用资源所有者的密码凭据需要对客户端应用程序非常信任。我们不想在可能会滥用凭据的应用程序中键入凭据。
资源所有者密码凭据通常将由用户代理客户端应用程序或者本机客户端应用程序使用。
客户凭证
客户端证书授权用于以下情况:客户端应用程序需要访问与特定服务器(例如用户)无关的资源或者调用资源服务器中的函数。例如,从Foursquare获取场所列表。这与特定的Foursquare用户无关。