理解OAuth 2.0
字数 2571 2025-08-29 08:31:47

OAuth 2.0 详解教学文档

一、OAuth 2.0 概述

OAuth 2.0 是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用。它解决了传统授权方式中的多个安全问题:

  1. 避免第三方应用保存用户密码
  2. 减少密码泄露风险
  3. 可以限制授权范围和有效期
  4. 用户可以独立撤销对特定应用的授权而不影响其他应用
  5. 防止一个应用的破解导致所有数据泄露

二、核心概念

  1. 第三方应用(Third-party application):又称"客户端"(client),如示例中的"云冲印"
  2. HTTP服务提供商(HTTP service):简称"服务提供商",如示例中的Google
  3. 资源所有者(Resource Owner):又称"用户"(user)
  4. 用户代理(User Agent):通常指浏览器
  5. 认证服务器(Authorization server):服务提供商专门处理认证的服务器
  6. 资源服务器(Resource server):存放用户生成资源的服务器

三、OAuth 2.0 设计思路

OAuth 在"客户端"与"服务提供商"之间设置了一个授权层

  • 客户端不能直接登录服务提供商,只能登录授权层
  • 客户端使用令牌(token)而非用户密码登录授权层
  • 用户可以指定令牌的权限范围和有效期
  • 服务提供商根据令牌的权限范围和有效期开放资源

四、基本流程

  1. 用户打开客户端,客户端要求用户授权
  2. 用户同意授权
  3. 客户端使用授权向认证服务器申请令牌
  4. 认证服务器验证后发放令牌
  5. 客户端使用令牌向资源服务器申请资源
  6. 资源服务器验证令牌后开放资源

五、四种授权模式

1. 授权码模式(Authorization Code)

最完整、最严密的授权模式,通过客户端后台服务器与服务提供商的认证服务器互动。

流程

  1. 用户访问客户端,被导向认证服务器
  2. 用户选择是否授权
  3. 用户授权后,认证服务器将用户导向客户端指定的重定向URI,并附上授权码
  4. 客户端用授权码和重定向URI向认证服务器申请令牌(后台完成)
  5. 认证服务器核对无误后发放访问令牌和更新令牌

参数说明

A步骤(客户端申请认证):

  • response_type:固定为"code"
  • client_id:客户端ID
  • redirect_uri:重定向URI(可选)
  • scope:申请的权限范围(可选)
  • state:客户端当前状态(可选)

C步骤(服务器回应):

  • code:授权码(有效期短,通常10分钟)
  • state:原样返回客户端发送的值

D步骤(申请令牌):

  • grant_type:固定为"authorization_code"
  • code:授权码
  • redirect_uri:必须与A步骤一致
  • client_id:客户端ID

E步骤(发放令牌):

  • access_token:访问令牌
  • token_type:令牌类型(如bearer)
  • expires_in:过期时间(秒)
  • refresh_token:更新令牌(可选)
  • scope:权限范围(若与申请一致可省略)

2. 简化模式(Implicit Grant)

不通过第三方应用服务器,直接在浏览器中完成,跳过授权码步骤。

流程

  1. 客户端将用户导向认证服务器
  2. 用户决定是否授权
  3. 用户授权后,认证服务器将用户导向指定重定向URI,并在URI的Hash部分包含访问令牌
  4. 浏览器向资源服务器发出请求(不含Hash)
  5. 资源服务器返回包含获取Hash值代码的网页
  6. 浏览器执行脚本提取令牌
  7. 浏览器将令牌发给客户端

参数说明

A步骤(客户端请求):

  • response_type:固定为"token"
  • client_id:客户端ID
  • redirect_uri:重定向URI(可选)
  • scope:权限范围(可选)
  • state:客户端当前状态(可选)

C步骤(服务器回应):

  • access_token:访问令牌
  • token_type:令牌类型
  • expires_in:过期时间(秒)
  • scope:权限范围(若一致可省略)
  • state:原样返回

3. 密码模式(Resource Owner Password Credentials)

用户直接向客户端提供用户名和密码,客户端用这些信息获取授权。

适用场景

  • 用户高度信任客户端(如操作系统或知名公司产品)
  • 其他模式无法执行时才考虑使用

流程

  1. 用户向客户端提供用户名和密码
  2. 客户端将凭据发给认证服务器申请令牌
  3. 认证服务器确认后提供访问令牌

参数说明

B步骤(申请令牌):

  • grant_type:固定为"password"
  • username:用户名
  • password:密码
  • scope:权限范围(可选)

C步骤(发放令牌):

  • 同授权码模式

重要限制:客户端不得保存用户密码

4. 客户端模式(Client Credentials)

客户端以自己的名义而非用户名义进行认证,严格说不属于OAuth框架要解决的问题。

流程

  1. 客户端向认证服务器进行身份认证,请求访问令牌
  2. 认证服务器确认后提供访问令牌

参数说明

A步骤(申请令牌):

  • grant_type:固定为"client_credentials"
  • scope:权限范围(可选)

B步骤(发放令牌):

  • 同授权码模式(通常不含refresh_token)

六、更新令牌机制

当访问令牌过期时,可使用更新令牌获取新的访问令牌。

请求参数

  • grant_type:固定为"refresh_token"
  • refresh_token:之前收到的更新令牌
  • scope:授权范围(不可超出上次范围,可省略表示与上次一致)

七、安全注意事项

  1. 授权码模式是最安全的模式,推荐使用
  2. 简化模式中令牌对访问者可见,需注意保护
  3. 密码模式需高度信任客户端,尽量避免使用
  4. 所有令牌都应设置合理的有效期
  5. 使用HTTPS保护所有通信
  6. 验证所有重定向URI防止开放重定向漏洞
  7. 使用state参数防止CSRF攻击

八、总结

OAuth 2.0提供了灵活、安全的授权机制,通过四种不同模式适应各种应用场景。理解每种模式的适用场景和参数要求,能够帮助开发者正确实现OAuth 2.0,构建更安全的授权系统。

OAuth 2.0 详解教学文档 一、OAuth 2.0 概述 OAuth 2.0 是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用。它解决了传统授权方式中的多个安全问题: 避免第三方应用保存用户密码 减少密码泄露风险 可以限制授权范围和有效期 用户可以独立撤销对特定应用的授权而不影响其他应用 防止一个应用的破解导致所有数据泄露 二、核心概念 第三方应用(Third-party application) :又称"客户端"(client),如示例中的"云冲印" HTTP服务提供商(HTTP service) :简称"服务提供商",如示例中的Google 资源所有者(Resource Owner) :又称"用户"(user) 用户代理(User Agent) :通常指浏览器 认证服务器(Authorization server) :服务提供商专门处理认证的服务器 资源服务器(Resource server) :存放用户生成资源的服务器 三、OAuth 2.0 设计思路 OAuth 在"客户端"与"服务提供商"之间设置了一个 授权层 : 客户端不能直接登录服务提供商,只能登录授权层 客户端使用令牌(token)而非用户密码登录授权层 用户可以指定令牌的权限范围和有效期 服务提供商根据令牌的权限范围和有效期开放资源 四、基本流程 用户打开客户端,客户端要求用户授权 用户同意授权 客户端使用授权向认证服务器申请令牌 认证服务器验证后发放令牌 客户端使用令牌向资源服务器申请资源 资源服务器验证令牌后开放资源 五、四种授权模式 1. 授权码模式(Authorization Code) 最完整、最严密的授权模式,通过客户端后台服务器与服务提供商的认证服务器互动。 流程 : 用户访问客户端,被导向认证服务器 用户选择是否授权 用户授权后,认证服务器将用户导向客户端指定的重定向URI,并附上授权码 客户端用授权码和重定向URI向认证服务器申请令牌(后台完成) 认证服务器核对无误后发放访问令牌和更新令牌 参数说明 : A步骤(客户端申请认证): response_type :固定为"code" client_id :客户端ID redirect_uri :重定向URI(可选) scope :申请的权限范围(可选) state :客户端当前状态(可选) C步骤(服务器回应): code :授权码(有效期短,通常10分钟) state :原样返回客户端发送的值 D步骤(申请令牌): grant_type :固定为"authorization_ code" code :授权码 redirect_uri :必须与A步骤一致 client_id :客户端ID E步骤(发放令牌): access_token :访问令牌 token_type :令牌类型(如bearer) expires_in :过期时间(秒) refresh_token :更新令牌(可选) scope :权限范围(若与申请一致可省略) 2. 简化模式(Implicit Grant) 不通过第三方应用服务器,直接在浏览器中完成,跳过授权码步骤。 流程 : 客户端将用户导向认证服务器 用户决定是否授权 用户授权后,认证服务器将用户导向指定重定向URI,并在URI的Hash部分包含访问令牌 浏览器向资源服务器发出请求(不含Hash) 资源服务器返回包含获取Hash值代码的网页 浏览器执行脚本提取令牌 浏览器将令牌发给客户端 参数说明 : A步骤(客户端请求): response_type :固定为"token" client_id :客户端ID redirect_uri :重定向URI(可选) scope :权限范围(可选) state :客户端当前状态(可选) C步骤(服务器回应): access_token :访问令牌 token_type :令牌类型 expires_in :过期时间(秒) scope :权限范围(若一致可省略) state :原样返回 3. 密码模式(Resource Owner Password Credentials) 用户直接向客户端提供用户名和密码,客户端用这些信息获取授权。 适用场景 : 用户高度信任客户端(如操作系统或知名公司产品) 其他模式无法执行时才考虑使用 流程 : 用户向客户端提供用户名和密码 客户端将凭据发给认证服务器申请令牌 认证服务器确认后提供访问令牌 参数说明 : B步骤(申请令牌): grant_type :固定为"password" username :用户名 password :密码 scope :权限范围(可选) C步骤(发放令牌): 同授权码模式 重要限制 :客户端不得保存用户密码 4. 客户端模式(Client Credentials) 客户端以自己的名义而非用户名义进行认证,严格说不属于OAuth框架要解决的问题。 流程 : 客户端向认证服务器进行身份认证,请求访问令牌 认证服务器确认后提供访问令牌 参数说明 : A步骤(申请令牌): grant_type :固定为"client_ credentials" scope :权限范围(可选) B步骤(发放令牌): 同授权码模式(通常不含refresh_ token) 六、更新令牌机制 当访问令牌过期时,可使用更新令牌获取新的访问令牌。 请求参数 : grant_type :固定为"refresh_ token" refresh_token :之前收到的更新令牌 scope :授权范围(不可超出上次范围,可省略表示与上次一致) 七、安全注意事项 授权码模式是最安全的模式,推荐使用 简化模式中令牌对访问者可见,需注意保护 密码模式需高度信任客户端,尽量避免使用 所有令牌都应设置合理的有效期 使用HTTPS保护所有通信 验证所有重定向URI防止开放重定向漏洞 使用state参数防止CSRF攻击 八、总结 OAuth 2.0提供了灵活、安全的授权机制,通过四种不同模式适应各种应用场景。理解每种模式的适用场景和参数要求,能够帮助开发者正确实现OAuth 2.0,构建更安全的授权系统。