OAuth 2.0 / RCF6749 协议解读

  OAuth是第三方应用授权的开放标准,目前版本是2.0版,以下将要介绍的内容和概念主要来源于该版本。恐篇幅太长,OAuth 的诞生背景就不在这里赘述了,可参考 RFC 6749 。

  四种角色定义

  1. Resource Owner:资源所有者,即终端用户
  2. Resource server:资源服务器,即提供资源存储访问一方
  3. Client:通常指第三方应用
  4. Authorization server:授权服务器

  协议端点(URI):OAuth给授权过程定义了Authorization、Token和Redirection三种端点。Authorization端点用来完成用户授权,在授权码模式(Authorization Code)隐含模式(Implicit)下被用到;Token端点用来交换与获取access token,不能包含fragment(hash),在隐含模式(Implicit)下则无需提供该端点;Redirection端点用来接收授权凭证,Public客户端或者Implicit授权的Confidential客户端必须注册其Redirection端点。

  客户端类型:OAuth根据是否能够进行安全认证定义了两种客户端类型:机密型客户端(Confidential)和公开型客户端(Public)。其中机密型客户端有Web应用,公开型客户端包括User Agent Based和Native应用。客户端的类型注册时确定,不能由授权服务器假定。如果一套应用包含多个不同类型的客户端,这些不同部分应分开单独注册。

  客户端认证(Client Authentication):客户端认证当满足授权服务器的安全要求,对机密性客户端的认证可依赖授权服务器发布的认证凭证(比如Password, Public/Private密钥对),而要对公共客户端进行认证很可能是不可靠的。客户端在每次请求中只能使用一种认证方法,如果客户端持有Password,可采用HTTP Basic认证或request-body传递身份凭证参数方法。客户端认证带来的益处:

  1. 强制绑定Refresh Token或Authorization Code到客户端
  2. 通过禁用或修改其凭证来快速恢复沦陷客户端
  3. 定期凭证轮换,更容易实现认证管理

  访问令牌(Access Token)是什么?Access Token是访问被保护资源的凭证,一个用来表明被授予权限的字符串,可以是一种可取回授权信息的标识,也可以自包含授权信息于内。可参考 RFC 6750 Bearer Token Usage 。

  更新令牌(Refresh Token)是什么?当Access Token无效或过期后,客户端将使用Refresh Token来请求授权服务器更新Access Token,除此而外别无他用。通常Refresh Token是授权服务器在发布新Access Token的同时可选发布的,与客户端绑定并长期有效,但是只有授权码模式(Authorization Code)用户密码模式(Resource Owner Password Credentials)支持Refresh Token。授权服务器须执行如下操作:

  1. 对于认证型客户端,要求进行认证
  2. 如果请求中包含客户端认证,则执行认证流程,还要保证Refresh Token是发布给认证客户端的
  3. 验证Refresh Token是否有效

  Transport Layer Security (TLS):授权服务器和资源服务器都必须实现TLS,至于客户端最好也实现TLS。如果客户端没有实现TLS,授权服务器在发出重定向之前应向用户发出安全告警信息。

  OAuth授权的基本流程如下

  

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

  OAuth针对不同场景详细定义了四种授权模式:授权码模式(Authorization Code)、隐含模式(Implicit)、用户密码模式(Resource Owner Password Credentials)和客户端模式(Client Credentials)。另外,你也可以使用其他扩展模式。

一. 授权码模式(Authorization Code)

  授权码模式是流程最严密的授权模式,但是如果被用于Public客户端授权,由于该客户端不能持有客户端证书,因此无法进行身份认证。

  • 流程解析

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

  该流程中客户端先获取授权码再交换访问令牌,似乎获取授权码显得多余?其实授权码除了代表授权范围之外,还避免了暴露访问令牌于用户端:

The authorization code provides a few important security benefits,such as the ability to authenticate the client, as well as the transmission of the access token directly to the client without passing it through the resource owner‘s user-agent and potentially exposing it to others, including the resource owner

二. 隐含模式(Implicit)

  授权码模式的简化版,跳过了"授权码"这一步,可适用于在浏览器中实现的应用,访问令牌暴露于用户端;在该模式下,授权服务器不会认证客户端,不能使用Refresh Token,一旦Access Token过期,需要重新进行授权处理;隐含模式是一个基于redirection的流,在某些情况下,客户端身份是可以通过redirection URI来验证的。在授权码模式可用的情况下,应权衡隐含模式的便利性和安全性。

  • 流程解析

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

  • 流程参数解释:此处不再详述,可参考理解OAuth 2.0 或 RFC6749

三. 用户密码模式(Resource Owner Password Credentials)

  用户向客户端提供自己的用户名和密码,客户端使用这些信息向授权服务器索要授权,但不得保存用户的密码。须在用户对客户端高度信任(比如客户端是操作系统的一部分,或者由一个著名公司出品),而认证服务器无法在其他授权模式下完成授权的情况下,才能考虑使用这种模式。

  • 流程解析

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

四. 客户端模式(Client Credentials)

  顾名思义,客户端模式不是针对单个用户的授权,而是针对客户端授权,适用于受保护资源已经处于客户端控制之下(相当于资源所有者)或者授权服务器已经预先配置好客户端访问权限的的情况。

  • 流程解析

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

  • 流程参数解释:此处不再详述,可参考理解OAuth 2.0 或 RFC6749

五. 授权模式选择

  • Web应用一般适用授权码模式(Authorization Code)
  • Native应用一般适用授权码模式(Authorization Code)或隐含模式(Implicit):指安装、运行在用户设备上的客户端,包括桌面应用、手机客户端等

    When choosing between the implicit grant type and the authorization code grant type, the following should be considered:
    
    . Native applications that use the authorization code grant type SHOULD do so without using client credentials, due to the native application‘s inability to keep client credentials confidential.
    . When using the implicit grant type flow, a refresh token is not returned, which requires repeating the authorization process once  the access token expires.
  • User Agent Based应用一般适用隐含模式(Implicit)

六. 安全风险

  • 客户端认证(Client Authentication):对Public客户端进行认证很可能是不可靠的,授权服务器可以尝试使用redirection URI或征募用户来验证客户端身份

       The authorization server MUST NOT issue client passwords or other
       client credentials to native application or user-agent-based
       application clients for the purpose of client authentication.  The
       authorization server MAY issue a client password or other credentials
       for a specific installation of a native application client on a
       specific device.
       ......
       A valid
       redirection URI is not sufficient to verify the client‘s identity
       when asking for resource owner authorization but can be used to
       prevent delivering credentials to a counterfeit client after
       obtaining resource owner authorization.
  • 更新令牌(Refresh Tokens):授权服务器可以给Web客户端和Native客户端发布Refresh Token。Refresh Token在整个生命周期中都应该保持机密性,不能泄露给任何无关的第三方;Refresh Token必须与客户端身份相绑定;Refresh Token不能未获授权而被生成、修改、猜测产生
时间: 2024-07-29 23:13:47

OAuth 2.0 / RCF6749 协议解读的相关文章

(转)OAuth 2.0授权协议详解和流程

这篇文章主要介绍了OAuth 2.0授权协议详解,本文对OAuth协议做了详解讲解,对OAuth协议的各个方面做了分解,读完本文你就会知道到底啥是OAuth了,需要的朋友可以参考下 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. 一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子.有一个"云冲印"的网站,可

SD3.0协议解读一

前言: 老衲我近期研究的是SD/MMC卡驱动,研究过的SD/MMC驱动的贫僧们都应该知道SD/MMC协议是必不可少的一部分,除非你不想研究透SD/MMC驱动,那你大可只研究driver/mmc/host目录下的文件即可.说到SD/MMC协议,网上一搜,SD3.0的协议只有英文版的资料,要想真正理解协议,英文水平差的贫僧就可吃力了,老衲英文水平实在是一般,但是网上对SD3.0协议的解读相关的中文资料实在是少的可怜.老衲怒想写写对SD3.0协议的理解,于是这一系列的SD3.0协议解读将会陆续问世..

SD3.0协议解读三

SD卡功能描述 所有主机和SD卡间的通信都是由主机控制的,这和USB是一致的,例如:U盘并没有主动通知USB控制器的能力,USB鼠标也没有主动通知USB控制器的能力,当然,SD卡也是没有主动通知SD控制器的能力的. 主机发送的命令有两种,一种是一对多,另一种自然是一对一了,他们分别是: 1.广播命令:广播命令发送给所有挂在SD总线上的SD卡,有一些广播命令需要SD卡作出响应. 2.寻址(点对点)命令:寻址命令只发送给具有相应地址的卡,并需要找到的那张卡返回一个响应. SD卡有两种模式,一种是卡识

oAuth 2.0协议解析

编号:OAPI-DESIGN-002 作者:刘海龙 微博:[http://weibo.com/liuhailong2008] 博客:[http://blog.csdn.net/stationxp] 协议概述 4个主体 完整的oAuth 2.0协议流包括4个主体,6个步骤. 4个主体分别是: - 资源拥有者:可以是人,负责授权工作.对Open API来说,即发布方.发布方审批调用者的申请,通过后,即完成授权,体现为数据库中的记录. - 客户端:一般是第三方应用程序.对于Open API来说,即调用

SD3.0协议解读二

在阅读本文章之前,请先思考一下什么是总线,总线的作用是什么?相信大家都学过I2C总线,它由SCL和SDA两条线组成,通过这两条线就能完成各种通信.同样地,SD卡通信也需要有自己的总线模式.SD卡还比较牛逼,支持SD总线和SPI总线,老衲接触的比较多的是SD总线,所以这篇文章仅介绍SD总线,对于SPI总线老衲以后有机会再介绍. SD总线: 大家都知道总线一般支持多种频率,在默认的频率下,SD总线支持一(主)对多(从)的模式,即支持一个HOST对多个SD卡的模式.但是,在高速和UHS-I,SD总线只

SD3.0协议解读四

前面的文章提到过SD卡主要分为两个操作模式,一是初始化和识别操作模式,另一种就是这篇文章需要分析的数据传输模式啦. 数据传输模式: 数据传输模式主要有六种状态,分别是Stand-by状态.Transfer状态.Sending-data状态.Receive-data状态.Programming状态.Disconnect状态.这六种状态通过不同的Command就可以切换到某种状态,换句话说,这六种状态贯穿了整个数据传输模式. 要理解数据传输模式的流程,老衲认为除了理解这六种状态,还需要对Comman

OAuth 2.0协议在SAP产品中的应用

阮一峰老师曾经在他的博文理解OAuth 2.0里对这个概念有了深入浅出的阐述. http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 本文会结合我在SAP做过的项目,来给大家介绍这个协议是如何应用到SAP产品中去的. 我做过的最早的一个和OAuth 2.0相关的项目,是2013年时作为SAP成都研究院CRM开发团队的一员,参与设计和开发了SAP CRM和社交媒体集成解决方案.该方案实现了Twitter, Facebook和新浪微博等社交媒体和

一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准,使用它就可以轻易地搭建一个单点登录服务器. 说是一直关注,是因为1年前,要为一个平台搭建一个OAuth 2.0服务器,当时由于IdentityServer3还处于开发阶段,核心还不稳定,扩展功能也不完备.无奈只好熟读OAuth 2.0的规范,并根据www.asp.net网站上的一个简单示例自己实现了

oAuth 2.0测试

编号:OAPI-DESIGN-005 作者:刘海龙 微博:[http://weibo.com/liuhailong2008] 博客:[http://blog.csdn.net/stationxp] 授权EntPoint 测试依据:rfc 6749.rfc 6750. 请求:http://localhost:8080/soapi/api/oauth2/authorize 返回状态码:400 返回消息:没有传递redirect uri. 请求:http://localhost:8080/soapi/