欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

OAuth 2.0协议原理学习汇总

OAuth 2.0协议原理学习汇总

本文整理自阮一峰 前辈的理解OAuth 2.0

整理的过程主要对协议认证逻辑的序列图和流程图用visio进行了重新绘制,整理一遍主要是为了加强对该协议的理解,也是一个进一步学习并掌握的过程,OAuth的作用就是让”客户端”安全可控地获取”用户”的授权,与”服务商提供商”进行互动。

  • OAuth2.0相关词汇的定义
  • OAuth2.0的运行逻辑
  • OAuth2.0的运行流程
  • OAuth2.0的授权模式

OAuth2.0相关词汇的定义

协议词汇中文释义
ThirdPartyApplication第三方应用程序,即客户端
HTTPServiceHTTP服务提供商,如:QQ,Sina
ResourceOwner资源所有者,本文中又称”用户”(user)
UserAgent用户代理,本文中就是指浏览器。
AuthorizationServer认证服务器,即服务提供商专门用来处理认证的服务器。
ResourceServer资源服务器,服务提供商存放用户生成的资源的服务器。

OAuth2.0的运行逻辑

OAuth在”客户端”与”服务提供商”之间,设置了一个授权层,”客户端”不能直接登录”服务提供商”,只能登录授权层,以此将用户与客户端区分开来。”客户端”登录授权层所用的令牌,与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。”客户端”登录授权层以后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料。

OAuth2.0的运行流程

客户端客户端用户用户认证服务器认证服务器资源服务器资源服务器要求用户给予授权判断是否给予客户端授权同意给予客户端授权申请令牌使用客户端获得的授权进行认证以后,确认无误,同意发放令牌。申请获取资源使用客户端获得的令牌确认令牌无误,同意向客户端开放资源

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

OAuth2.0客户端的授权模式

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

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

  • A用户访问客户端,后者将前者导向认证服务器。 
    A步骤中,客户端申请认证的URI,包含以下参数:
    • response_type:表示授权类型,必选项,此处的值固定为”code”
    • client_id:表示客户端的ID,必选项
    • redirect_uri:表示重定向URI,可选项
    • scope:表示申请的权限范围,可选项
    • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
  • B用户选择是否给予客户端授权。
  • C假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
  • C步骤中,服务器回应客户端的URI,包含以下参数:
    • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
    • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
  • D客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请 
    令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。 
    D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
    • grant_type:表示使用的授权模式,必选项,此处的值固定为”authorization_code”。
    • code:表示上一步获得的授权码,必选项。
    • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
    • client_id:表示客户端ID,必选项。
  • E认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。 
    E步骤中,认证服务器发送的HTTP回复,包含以下参数:
    • access_token:表示访问令牌,必选项。
    • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
    • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
    • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
    • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。 
      更新令牌 
      如果用户访问的时候,客户端的”访问令牌”已经过期,则需要使用”更新令牌”申请一个新的访问令牌。 
      客户端发出更新令牌的HTTP请求,包含以下参数:
    • granttype:表示使用的授权模式,此处的值固定为”refreshtoken”,必选项。
    • refresh_token:表示早前收到的更新令牌,必选项。
    • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

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

这里写图片描述

  • A客户端将用户导向认证服务器。 
    A步骤中,客户端发出的HTTP请求,包含以下参数:
    • response_type:表示授权类型,此处的值固定为”token”,必选项。
    • client_id:表示客户端的ID,必选项。
    • redirect_uri:表示重定向的URI,可选项。
    • scope:表示权限范围,可选项。
    • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
  • B用户决定是否给于客户端授权。
  • C假设用户给予授权,认证服务器将用户导向客户端指定的”重定向- URI”,并在URI的Hash部分包含了访问令牌。 
    C步骤中,认证服务器回应客户端的URI,包含以下参数:
    • access_token:表示访问令牌,必选项。
    • token_type:表示令牌类型,该值大小写不敏感,必选项。
    • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
    • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
    • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
  • D浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
  • E资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
  • F浏览器执行上一步获得的脚本,提取出令牌。
  • G浏览器将令牌发给客户端。

密码模式 
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向”服务商提供商”索要授权。 
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。 
步骤:

  • A用户向客户端提供用户名和密码。
  • B客户端将用户名和密码发给认证服务器,向后者请求令牌。 
    B步骤中,客户端发出的HTTP请求,包含以下参数:
    • grant_type:表示授权类型,此处的值固定为”password”,必选项。
    • username:表示用户名,必选项。
    • password:表示用户的密码,必选项。
    • scope:表示权限范围,可选项。
  • C认证服务器确认无误后,向客户端提供访问令牌。

客户端模式 
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。认证服务器必须以某种方式,验证客户端身份。 
步骤:

  • A客户端向认证服务器进行身份认证,并要求一个访问令牌。 
    A步骤中,客户端发出的HTTP请求,包含以下参数:
    • granttype:表示授权类型,此处的值固定为”clientcredentials”,必选项。
    • scope:表示权限范围,可选项。
  • B认证服务器确认无误后,向客户端提供访问令牌。

    OAuth 2.0协议原理学习汇总

    本文整理自阮一峰 前辈的理解OAuth 2.0

    整理的过程主要对协议认证逻辑的序列图和流程图用visio进行了重新绘制,整理一遍主要是为了加强对该协议的理解,也是一个进一步学习并掌握的过程,OAuth的作用就是让”客户端”安全可控地获取”用户”的授权,与”服务商提供商”进行互动。

    • OAuth2.0相关词汇的定义
    • OAuth2.0的运行逻辑
    • OAuth2.0的运行流程
    • OAuth2.0的授权模式

    OAuth2.0相关词汇的定义

    协议词汇中文释义
    ThirdPartyApplication第三方应用程序,即客户端
    HTTPServiceHTTP服务提供商,如:QQ,Sina
    ResourceOwner资源所有者,本文中又称”用户”(user)
    UserAgent用户代理,本文中就是指浏览器。
    AuthorizationServer认证服务器,即服务提供商专门用来处理认证的服务器。
    ResourceServer资源服务器,服务提供商存放用户生成的资源的服务器。

    OAuth2.0的运行逻辑

    OAuth在”客户端”与”服务提供商”之间,设置了一个授权层,”客户端”不能直接登录”服务提供商”,只能登录授权层,以此将用户与客户端区分开来。”客户端”登录授权层所用的令牌,与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。”客户端”登录授权层以后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料。

    OAuth2.0的运行流程

    客户端客户端用户用户认证服务器认证服务器资源服务器资源服务器要求用户给予授权判断是否给予客户端授权同意给予客户端授权申请令牌使用客户端获得的授权进行认证以后,确认无误,同意发放令牌。申请获取资源使用客户端获得的令牌确认令牌无误,同意向客户端开放资源

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

    OAuth2.0客户端的授权模式

    • 授权码模式(authorization code)
    • 简化模式(implicit)
    • 密码模式(resource owner password credentials)
    • 客户端模式(client credentials)

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

    • A用户访问客户端,后者将前者导向认证服务器。 
      A步骤中,客户端申请认证的URI,包含以下参数:
      • response_type:表示授权类型,必选项,此处的值固定为”code”
      • client_id:表示客户端的ID,必选项
      • redirect_uri:表示重定向URI,可选项
      • scope:表示申请的权限范围,可选项
      • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
    • B用户选择是否给予客户端授权。
    • C假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
    • C步骤中,服务器回应客户端的URI,包含以下参数:
      • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
      • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
    • D客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请 
      令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。 
      D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
      • grant_type:表示使用的授权模式,必选项,此处的值固定为”authorization_code”。
      • code:表示上一步获得的授权码,必选项。
      • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
      • client_id:表示客户端ID,必选项。
    • E认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。 
      E步骤中,认证服务器发送的HTTP回复,包含以下参数:
      • access_token:表示访问令牌,必选项。
      • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
      • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
      • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
      • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。 
        更新令牌 
        如果用户访问的时候,客户端的”访问令牌”已经过期,则需要使用”更新令牌”申请一个新的访问令牌。 
        客户端发出更新令牌的HTTP请求,包含以下参数:
      • granttype:表示使用的授权模式,此处的值固定为”refreshtoken”,必选项。
      • refresh_token:表示早前收到的更新令牌,必选项。
      • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

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

    这里写图片描述

    • A客户端将用户导向认证服务器。 
      A步骤中,客户端发出的HTTP请求,包含以下参数:
      • response_type:表示授权类型,此处的值固定为”token”,必选项。
      • client_id:表示客户端的ID,必选项。
      • redirect_uri:表示重定向的URI,可选项。
      • scope:表示权限范围,可选项。
      • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
    • B用户决定是否给于客户端授权。
    • C假设用户给予授权,认证服务器将用户导向客户端指定的”重定向- URI”,并在URI的Hash部分包含了访问令牌。 
      C步骤中,认证服务器回应客户端的URI,包含以下参数:
      • access_token:表示访问令牌,必选项。
      • token_type:表示令牌类型,该值大小写不敏感,必选项。
      • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
      • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
      • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
    • D浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
    • E资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
    • F浏览器执行上一步获得的脚本,提取出令牌。
    • G浏览器将令牌发给客户端。

    密码模式 
    密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向”服务商提供商”索要授权。 
    在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。 
    步骤:

    • A用户向客户端提供用户名和密码。
    • B客户端将用户名和密码发给认证服务器,向后者请求令牌。 
      B步骤中,客户端发出的HTTP请求,包含以下参数:
      • grant_type:表示授权类型,此处的值固定为”password”,必选项。
      • username:表示用户名,必选项。
      • password:表示用户的密码,必选项。
      • scope:表示权限范围,可选项。
    • C认证服务器确认无误后,向客户端提供访问令牌。

    客户端模式 
    客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。认证服务器必须以某种方式,验证客户端身份。 
    步骤:

    • A客户端向认证服务器进行身份认证,并要求一个访问令牌。 
      A步骤中,客户端发出的HTTP请求,包含以下参数:
      • granttype:表示授权类型,此处的值固定为”clientcredentials”,必选项。
      • scope:表示权限范围,可选项。
    • B认证服务器确认无误后,向客户端提供访问令牌。

      OAuth 2.0协议原理学习汇总

      本文整理自阮一峰 前辈的理解OAuth 2.0

      整理的过程主要对协议认证逻辑的序列图和流程图用visio进行了重新绘制,整理一遍主要是为了加强对该协议的理解,也是一个进一步学习并掌握的过程,OAuth的作用就是让”客户端”安全可控地获取”用户”的授权,与”服务商提供商”进行互动。

      • OAuth2.0相关词汇的定义
      • OAuth2.0的运行逻辑
      • OAuth2.0的运行流程
      • OAuth2.0的授权模式

      OAuth2.0相关词汇的定义

      协议词汇中文释义
      ThirdPartyApplication第三方应用程序,即客户端
      HTTPServiceHTTP服务提供商,如:QQ,Sina
      ResourceOwner资源所有者,本文中又称”用户”(user)
      UserAgent用户代理,本文中就是指浏览器。
      AuthorizationServer认证服务器,即服务提供商专门用来处理认证的服务器。
      ResourceServer资源服务器,服务提供商存放用户生成的资源的服务器。

      OAuth2.0的运行逻辑

      OAuth在”客户端”与”服务提供商”之间,设置了一个授权层,”客户端”不能直接登录”服务提供商”,只能登录授权层,以此将用户与客户端区分开来。”客户端”登录授权层所用的令牌,与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。”客户端”登录授权层以后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料。

      OAuth2.0的运行流程

      客户端客户端用户用户认证服务器认证服务器资源服务器资源服务器要求用户给予授权判断是否给予客户端授权同意给予客户端授权申请令牌使用客户端获得的授权进行认证以后,确认无误,同意发放令牌。申请获取资源使用客户端获得的令牌确认令牌无误,同意向客户端开放资源

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

      OAuth2.0客户端的授权模式

      • 授权码模式(authorization code)
      • 简化模式(implicit)
      • 密码模式(resource owner password credentials)
      • 客户端模式(client credentials)

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

      • A用户访问客户端,后者将前者导向认证服务器。 
        A步骤中,客户端申请认证的URI,包含以下参数:
        • response_type:表示授权类型,必选项,此处的值固定为”code”
        • client_id:表示客户端的ID,必选项
        • redirect_uri:表示重定向URI,可选项
        • scope:表示申请的权限范围,可选项
        • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
      • B用户选择是否给予客户端授权。
      • C假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
      • C步骤中,服务器回应客户端的URI,包含以下参数:
        • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
        • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
      • D客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请 
        令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。 
        D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
        • grant_type:表示使用的授权模式,必选项,此处的值固定为”authorization_code”。
        • code:表示上一步获得的授权码,必选项。
        • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
        • client_id:表示客户端ID,必选项。
      • E认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。 
        E步骤中,认证服务器发送的HTTP回复,包含以下参数:
        • access_token:表示访问令牌,必选项。
        • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
        • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
        • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
        • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。 
          更新令牌 
          如果用户访问的时候,客户端的”访问令牌”已经过期,则需要使用”更新令牌”申请一个新的访问令牌。 
          客户端发出更新令牌的HTTP请求,包含以下参数:
        • granttype:表示使用的授权模式,此处的值固定为”refreshtoken”,必选项。
        • refresh_token:表示早前收到的更新令牌,必选项。
        • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

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

      这里写图片描述

      • A客户端将用户导向认证服务器。 
        A步骤中,客户端发出的HTTP请求,包含以下参数:
        • response_type:表示授权类型,此处的值固定为”token”,必选项。
        • client_id:表示客户端的ID,必选项。
        • redirect_uri:表示重定向的URI,可选项。
        • scope:表示权限范围,可选项。
        • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
      • B用户决定是否给于客户端授权。
      • C假设用户给予授权,认证服务器将用户导向客户端指定的”重定向- URI”,并在URI的Hash部分包含了访问令牌。 
        C步骤中,认证服务器回应客户端的URI,包含以下参数:
        • access_token:表示访问令牌,必选项。
        • token_type:表示令牌类型,该值大小写不敏感,必选项。
        • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
        • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
        • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
      • D浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
      • E资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
      • F浏览器执行上一步获得的脚本,提取出令牌。
      • G浏览器将令牌发给客户端。

      密码模式 
      密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向”服务商提供商”索要授权。 
      在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。 
      步骤:

      • A用户向客户端提供用户名和密码。
      • B客户端将用户名和密码发给认证服务器,向后者请求令牌。 
        B步骤中,客户端发出的HTTP请求,包含以下参数:
        • grant_type:表示授权类型,此处的值固定为”password”,必选项。
        • username:表示用户名,必选项。
        • password:表示用户的密码,必选项。
        • scope:表示权限范围,可选项。
      • C认证服务器确认无误后,向客户端提供访问令牌。

      客户端模式 
      客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。认证服务器必须以某种方式,验证客户端身份。 
      步骤:

      • A客户端向认证服务器进行身份认证,并要求一个访问令牌。 
        A步骤中,客户端发出的HTTP请求,包含以下参数:
        • granttype:表示授权类型,此处的值固定为”clientcredentials”,必选项。
        • scope:表示权限范围,可选项。
      • B认证服务器确认无误后,向客户端提供访问令牌。

        OAuth 2.0协议原理学习汇总

        本文整理自阮一峰 前辈的理解OAuth 2.0

        整理的过程主要对协议认证逻辑的序列图和流程图用visio进行了重新绘制,整理一遍主要是为了加强对该协议的理解,也是一个进一步学习并掌握的过程,OAuth的作用就是让”客户端”安全可控地获取”用户”的授权,与”服务商提供商”进行互动。

        OAuth2.0相关词汇的定义

        协议词汇中文释义
        ThirdPartyApplication第三方应用程序,即客户端
        HTTPServiceHTTP服务提供商,如:QQ,Sina
        ResourceOwner资源所有者,本文中又称”用户”(user)
        UserAgent用户代理,本文中就是指浏览器。
        AuthorizationServer认证服务器,即服务提供商专门用来处理认证的服务器。
        ResourceServer资源服务器,服务提供商存放用户生成的资源的服务器。

        OAuth2.0的运行逻辑

        OAuth在”客户端”与”服务提供商”之间,设置了一个授权层,”客户端”不能直接登录”服务提供商”,只能登录授权层,以此将用户与客户端区分开来。”客户端”登录授权层所用的令牌,与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。”客户端”登录授权层以后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料。

        OAuth2.0的运行流程

        客户端客户端用户用户认证服务器认证服务器资源服务器资源服务器要求用户给予授权判断是否给予客户端授权同意给予客户端授权申请令牌使用客户端获得的授权进行认证以后,确认无误,同意发放令牌。申请获取资源使用客户端获得的令牌确认令牌无误,同意向客户端开放资源

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

        OAuth2.0客户端的授权模式

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

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

        这里写图片描述

        密码模式 
        密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向”服务商提供商”索要授权。 
        在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。 
        步骤:

        客户端模式 
        客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向”服务提供商”进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商”提供服务,其实不存在授权问题。认证服务器必须以某种方式,验证客户端身份。 
        步骤:

        • OAuth2.0相关词汇的定义
        • OAuth2.0的运行逻辑
        • OAuth2.0的运行流程
        • OAuth2.0的授权模式
        • 授权码模式(authorization code)
        • 简化模式(implicit)
        • 密码模式(resource owner password credentials)
        • 客户端模式(client credentials)
        • A用户访问客户端,后者将前者导向认证服务器。 
          A步骤中,客户端申请认证的URI,包含以下参数:
          • response_type:表示授权类型,必选项,此处的值固定为”code”
          • client_id:表示客户端的ID,必选项
          • redirect_uri:表示重定向URI,可选项
          • scope:表示申请的权限范围,可选项
          • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
        • B用户选择是否给予客户端授权。
        • C假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
        • C步骤中,服务器回应客户端的URI,包含以下参数:
          • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
          • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
        • D客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请 
          令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。 
          D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:
          • grant_type:表示使用的授权模式,必选项,此处的值固定为”authorization_code”。
          • code:表示上一步获得的授权码,必选项。
          • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
          • client_id:表示客户端ID,必选项。
        • E认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。 
          E步骤中,认证服务器发送的HTTP回复,包含以下参数:
          • access_token:表示访问令牌,必选项。
          • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
          • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
          • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
          • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。 
            更新令牌 
            如果用户访问的时候,客户端的”访问令牌”已经过期,则需要使用”更新令牌”申请一个新的访问令牌。 
            客户端发出更新令牌的HTTP请求,包含以下参数:
          • granttype:表示使用的授权模式,此处的值固定为”refreshtoken”,必选项。
          • refresh_token:表示早前收到的更新令牌,必选项。
          • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。
        • A客户端将用户导向认证服务器。 
          A步骤中,客户端发出的HTTP请求,包含以下参数:
          • response_type:表示授权类型,此处的值固定为”token”,必选项。
          • client_id:表示客户端的ID,必选项。
          • redirect_uri:表示重定向的URI,可选项。
          • scope:表示权限范围,可选项。
          • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
        • B用户决定是否给于客户端授权。
        • C假设用户给予授权,认证服务器将用户导向客户端指定的”重定向- URI”,并在URI的Hash部分包含了访问令牌。 
          C步骤中,认证服务器回应客户端的URI,包含以下参数:
          • access_token:表示访问令牌,必选项。
          • token_type:表示令牌类型,该值大小写不敏感,必选项。
          • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
          • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
          • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
        • D浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
        • E资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
        • F浏览器执行上一步获得的脚本,提取出令牌。
        • G浏览器将令牌发给客户端。
        • A用户向客户端提供用户名和密码。
        • B客户端将用户名和密码发给认证服务器,向后者请求令牌。 
          B步骤中,客户端发出的HTTP请求,包含以下参数:
          • grant_type:表示授权类型,此处的值固定为”password”,必选项。
          • username:表示用户名,必选项。
          • password:表示用户的密码,必选项。
          • scope:表示权限范围,可选项。
        • C认证服务器确认无误后,向客户端提供访问令牌。
        • A客户端向认证服务器进行身份认证,并要求一个访问令牌。 
          A步骤中,客户端发出的HTTP请求,包含以下参数:
          • granttype:表示授权类型,此处的值固定为”clientcredentials”,必选项。
          • scope:表示权限范围,可选项。
        • B认证服务器确认无误后,向客户端提供访问令牌。
    • 来自  http://blog.csdn.net/DahlinSky/article/details/45843439
普通分类: