微服务系列之-Oauth2安全认证


前言

OAuth是一个关于授权(authorization)的开放网络标准,在业界得到广泛应用,目前的版本是2.0版。
简单来说就是客户端应用程序(通常是web浏览器)代表用户(得到了用户的批准)去访问受保护的资源。


一、微信Oauth2认证

OAuth2的设计背景,在于允许用户在不告知第三方自己的帐号密码情况下,通过授权方式,让第三方服务可以获取自己的资源信息。
下面简单说明OAuth2中最经典的Authorization Code模式,流程如下:
在这里插入图片描述流程图中,包含四个角色:

  • ResourceOwner 为资源所有者,即为用户
  • User-Agent 为浏览器
  • AuthorizationServer 为认证服务器,可以理解为用户资源托管方,比如企业微信服务端
  • Client 为第三方服务

调用流程:

  1. 用户访问第三方服务,第三方服务通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
  2. 用户选择是否同意授权
  3. 若用户同意授权,则认证服务器将用户重定向到第一步指定的重定向URI,同时附上一个授权码。
  4. 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
  5. 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)

4/5 的调用为后台调用,不通过浏览器进行

在这里插入图片描述流程图中,包含四个角色:

二、其他Oauth2认证

另外一种说法,其实就是比上一步多了资源服务器,这种是将权限认证与具体的业务模块做了分离。

在这里插入图片描述流程图中,包含四个角色:

  • 资源拥有者(如用户)
  • 授权服务器(Authorization Server)
  • 资源服务器(Resource Server)
  • 客户端(Client application)

调用流程:

  1. 用户打开客户端以后,客户端要求用户给予授权
  2. 用户同意给予客户端授权
  3. 客户端使用上一步获得的授权,向认证服务器申请令牌
  4. 认证服务器对客户端进行认证以后,确认无误,同意发放令牌
  5. 客户端使用令牌,向资源服务器申请获取资源
  6. 资源服务器确认令牌无误,同意向客户端开放资源

三、客户端的授权模式

客户端必须得到用户的授权(Authorization Grant),才能获得令牌(access token)。OAuth 2.0 定义了四种授权方式:authorization code、implicit、resource owner password credentials、client credentials。

1、授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与”服务提供商”的认证服务器进行互动。流程如下:

  1. 用户访问客户端,后者将前者导向认证服务器。
  2. 用户选择是否给予客户端授权。
  3. 假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向 URI”(redirection URI),同时附上一个授权码。
  4. 客户端收到授权码,附上早先的”重定向 URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
  5. 认证服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

上面介绍的企业微信就是这种认证。

2、简化模式

简化模式(Implicit Grant Type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了”授权码”这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。流程如下:

  1. 客户端将用户导向认证服务器。
  2. 用户决定是否给于客户端授权。
  3. 假设用户给予授权,认证服务器将用户导向客户端指定的”重定向 URI”,并在 URI 的 Hash 部分包含了访问令牌。
  4. 浏览器向资源服务器发出请求,其中不包括上一步收到的 Hash 值。
  5. 资源服务器返回一个网页,其中包含的代码可以获取 Hash 值中的令牌。
  6. 浏览器执行上一步获得的脚本,提取出令牌。
  7. 浏览器将令牌发给客户端。

3、密码模式

密码模式(Resource Owner Password Credentials)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向”服务商提供商”索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。流程如下:

  1. 用户向客户端提供用户名和密码。
  2. 客户端将用户名和密码发给认证服务器,向后者请求令牌。
  3. 认证服务器确认无误后,向客户端提供访问令牌。

4、客户端模式

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。

在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。流程如下:

  1. 客户端向认证服务器进行身份认证,并要求一个访问令牌。
  2. 认证服务器确认无误后,向客户端提供访问令牌。

总结

目前只用过企业微信的Oauth2认证,即授权码模式,这种模式确实很严谨,也很安全不需要客户确认,设置静默模式就行,使用起来还是很方便的。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页