Haste makes waste

彻底理解 OAuth2 协议

Posted on By lijun

参照:

1. 概要

OAuth 2.0是一个工业级别的开发授权协议,可以使互联网用户授权第三方网站或应用访问他们在特定网站上的信息(如个人资料、照片等),而不必向第三方网站或应用提供密码。在此之前我们使用用户名和密码的方式登录到应用,聪明的互联网前辈们发明了 OAuth 授权协议提出了一个 “授权服务器”,经过用户授权后授权服务器向第三方应用发放一个访问令牌,这样就可以在不向第三方应用提供账号和密码的情况下,通过令牌在特定时间内访问用户存放在特定资源服务器上的资源。

比如下面的场景,在Automation cloud的login画面,如下图,有普通的用户名和密码登陆方式,也有google等的登陆方式,其中google等的登陆方式就是采用OAuth2.0协议。

image

点击google登陆后,会出现提示授权的信息框,如下图,其URL也转向了

https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?prompt=select_account&response_type=code&redirect_uri=https%3A%2F%2Faccount.uipath.com%2Flogin%2Fcallback&scope=email%20profile&state=_VRgc_DnnCoz2ByrSLALp3Qtr2MMwE0n&client_id=728299124437-7jehbc7o304f05q191vsc8nuf0g9truf.apps.googleusercontent.com&flowName=GeneralOAuthFlow

上面的URL中有如下信息:

  • response type:这里是code,表示OAuth的授权方式是授权码形式
  • state:这个参数用于发送给授权服务器,是一个随机码,在授权码完成授权后,会将这个state码再次发送回来,表示是真的授权服务器发送的response,主要用于防止CSRF攻击,是option但是建议填写,这样站点更安全。
  • redirect uri:通过客户端注册的重定向URI
  • scope:可选,请求资源范围
  • client id:在授权服务器注册应用后获得的唯一标识

image

如果我选择Microsoft,其URL转向了

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?prompt=select_account&response_type=code&redirect_uri=https%3A%2F%2Faccount.uipath.com%2Flogin%2Fcallback&scope=User.Read%20openid%20email%20profile%20&state=3fBsF9rNTapMzZhltTDiKawXFxwBbcGA&client_id=eb812cb0-7881-44a8-82f7-df95f812e34d

上面的URL中的信息,应该是提交给google和ms的重定向URL以及访问的scope,以及自身的clientID等。

在Google 和 MS中通过认证后,会发行token,通过token就可以登陆到Automation Cloud了。

2. 理解Auth2.0协议

1.协议角色和流程

image

上图中,资源服务器和认证服务器很多时候都是同一个,属于同一个域名,上面的例子中就是google。

image

  • 上图A和B,分别对应了选择google去login,以及后续的点击同意,同意后得到Resource Owner的授权(允许uipath访问google中的姓名,用户邮件,profile照片等)。
  • C,Client即Aumation Cloud,拿着自己的code(ClientID,SecretKey),去向AuthorizationServer请求Access Token。
  • D,Authorization Server通过请求后,发行Access Token,有时也会同时附带用户名等。
  • E和F,拿到Token后,就可以通过Access Token去Resource Server资源服务器获取需要的信息,比如在Automation Cloud中的user and group中,可以获取到所有用户名,email等信息。

2. A.B 用户选择授权

即上面的点击google 登陆,然后弹出授权提示,接受将用户名等信息共享给 uipath.com。

3. C.Authorization Grant OAuth授权

在OAuth授权之前,授权所需要的信息:

  • 应用名称
  • 应用网站
  • 重定向URL或回调URL(redirect_url)
  • client id
  • client secret

上面的信息是Automation Cloud端所需要的,client id,Client secret,以及应用名称等都是授权服务器Authorization Server所发行的。

比如在Google上的注册画面如下: image

然后将google上发行的client id等信息设定到Automation cloud上。

4. D.发行Access token

在发行Access token时,这里其实还有一步,即授权服务器首先是返回一个code和state过来,然后client通过这个code,以及client id和client secret,再次访问授权服务器,获取access token,client再通过access token去访问资源服务器。

3. OAuth授权方式

1. 授权码模式

image

通过授权服务器给client的call back中code,再次通过code去请求access token。

授权码模式时需要的参数如下: image

为了更加加强安全性,会对access token加上时间限定,同时提供refresh token,这样简化下一次access token的获取,具体流程如下: image

2. 简化模式

这是上面授权码模式的简化,没有返回code,而是直接返回了access token,这样讲access token暴露了不是很安全。

image

3. 密码模式

这里是在点击client时,client要求你输入授权服务器,比如google上的用户名和密码,然后去google 认证,这样显然是不合适的,用户不一定会信任这个client,因为这个client可能会保存用户名和密码。

image

4. 客户端模式

image