前言
OAuth是一个关于授权(authorization)的开放网络标准,在业界得到广泛应用,目前的版本是2.0版。
简单来说就是客户端应用程序(通常是web浏览器)代表用户(得到了用户的批准)去访问受保护的资源。
一、微信Oauth2认证
OAuth2的设计背景,在于允许用户在不告知第三方自己的帐号密码情况下,通过授权方式,让第三方服务可以获取自己的资源信息。
下面简单说明OAuth2中最经典的Authorization Code模式,流程如下:
流程图中,包含四个角色:
- ResourceOwner 为资源所有者,即为用户
- User-Agent 为浏览器
- AuthorizationServer 为认证服务器,可以理解为用户资源托管方,比如企业微信服务端
- Client 为第三方服务
调用流程:
- 用户访问第三方服务,第三方服务通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
- 用户选择是否同意授权
- 若用户同意授权,则认证服务器将用户重定向到第一步指定的重定向URI,同时附上一个授权码。
- 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
- 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)
4/5 的调用为后台调用,不通过浏览器进行
流程图中,包含四个角色:
二、其他Oauth2认证
另外一种说法,其实就是比上一步多了资源服务器,这种是将权限认证与具体的业务模块做了分离。
流程图中,包含四个角色:
- 资源拥有者(如用户)
- 授权服务器(Authorization Server)
- 资源服务器(Resource Server)
- 客户端(Client application)
调用流程:
- 用户打开客户端以后,客户端要求用户给予授权
- 用户同意给予客户端授权
- 客户端使用上一步获得的授权,向认证服务器申请令牌
- 认证服务器对客户端进行认证以后,确认无误,同意发放令牌
- 客户端使用令牌,向资源服务器申请获取资源
- 资源服务器确认令牌无误,同意向客户端开放资源
三、客户端的授权模式
客户端必须得到用户的授权(Authorization Grant),才能获得令牌(access token)。OAuth 2.0 定义了四种授权方式:authorization code、implicit、resource owner password credentials、client credentials。
1、授权码模式
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与”服务提供商”的认证服务器进行互动。流程如下:
- 用户访问客户端,后者将前者导向认证服务器。
- 用户选择是否给予客户端授权。
- 假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向 URI”(redirection URI),同时附上一个授权码。
- 客户端收到授权码,附上早先的”重定向 URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
- 认证服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
上面介绍的企业微信就是这种认证。
2、简化模式
简化模式(Implicit Grant Type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了”授权码”这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。流程如下:
- 客户端将用户导向认证服务器。
- 用户决定是否给于客户端授权。
- 假设用户给予授权,认证服务器将用户导向客户端指定的”重定向 URI”,并在 URI 的 Hash 部分包含了访问令牌。
- 浏览器向资源服务器发出请求,其中不包括上一步收到的 Hash 值。
- 资源服务器返回一个网页,其中包含的代码可以获取 Hash 值中的令牌。
- 浏览器执行上一步获得的脚本,提取出令牌。
- 浏览器将令牌发给客户端。
3、密码模式
密码模式(Resource Owner Password Credentials)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向”服务商提供商”索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。流程如下:
- 用户向客户端提供用户名和密码。
- 客户端将用户名和密码发给认证服务器,向后者请求令牌。
- 认证服务器确认无误后,向客户端提供访问令牌。
4、客户端模式
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。
在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。流程如下:
- 客户端向认证服务器进行身份认证,并要求一个访问令牌。
- 认证服务器确认无误后,向客户端提供访问令牌。
总结
目前只用过企业微信的Oauth2认证,即授权码模式,这种模式确实很严谨,也很安全不需要客户确认,设置静默模式就行,使用起来还是很方便的。