什么是OAuth 2
- OAuth 2.0是一种授权协议,它的核心是授权许可和令牌机制。
- 它通过颁发访问令牌给第三方,允许第三方代表用户访问该用户的数据,而不是直接给第三方用户名和密码。
- 它主要用来保护Web API接口,第三方只有得到授权和访问令牌后,才能访问API。
- 它实现了第三方软件安全地代表用户访问数据,不会增加安全风险。
- 典型的授权流程包括:用户登录、用户授权、颁发授权码、第三方用授权码换取访问令牌、第三方使用访问令牌获取数据。
- OAuth 2.0在许多场景中应用,如微信登录其他App、使用微信小程序等。
- 授权码许可是OAuth 2.0中最完备、安全的授权方式。
- OAuth 2.0核心思想可应用到不同场景中,保证了通信安全的同时提高了用户体验。
对授权码的要求
- OAuth2.0 中,访问令牌需要高度保密,不能直接暴露在浏览器中。如果不使用授权码,获取访问令牌时就只能通过后端通信,无法建立用户与客户端的“连接”。
- 使用授权码可以实现两次重定向,既保证了安全性,又实现了用户体验。第一次重定向用于获取授权码,第二次重定向用于重新建立用户和客户端的连接。
- 授权码作为临时凭证,可以在前端暴露,而访问令牌只能在后端流转。这样既满足了通信安全性,又实现了用户的顺畅体验。
- 授权码实现了间接通信获取授权码和直接通信获取访问令牌的结合,完美组织了OAuth2.0的四个角色的交互。
- 授权码许可的思想可以移植到其他场景,如微信小程序中也采用了类似流程。
- 总体来说,授权码机制使授权码许可类型成为OAuth2.0中流程最完善、安全性最高的授权流程。
工作流程
授权服务的工作流程可以总结如下:
- 授权服务负责颁发访问令牌,是OAuth 2.0的核心。
- 它的工作可以分为两大部分:颁发授权码和颁发访问令牌。
- 颁发授权码需要准备工作,包括验证基本信息、验证权限范围、生成授权页面。
- 用户授权后,继续验证权限范围、生成并绑定授权码、重定向回调地址。
- 颁发访问令牌需要验证第三方软件信息、验证授权码、生成访问令牌并绑定信息。
- 同时生成刷新令牌,用于在访问令牌过期后重新获取访问令牌。
- 使用刷新令牌需要验证信息、重新生成访问令牌。
- 在整个流程中都需要验证权限范围,确保最小授权原则。
- 授权服务承担了复杂性,使第三方软件接入OAuth 2.0更简单。
JWT令牌
关于 JWT 令牌,可以概括以下关键点:
- JWT 是一种结构化的令牌格式,包含 HEADER、PAYLOAD、SIGNATURE 三部分。
- HEADER 表示头部信息,PAYLOAD 表示数据体,SIGNATURE 是签名。
- JWT 可以在令牌中包含用户授权信息,不需要数据库或 RPC 查询。
- 使用 JWT 可以实现令牌内检,受保护资源直接解析 JWT 即可。
- JWT 的优点在于计算代替存储、强制加密、增强系统可用性。
- JWT 的缺点是无法在使用过程中修改令牌状态,需要配套密钥管理。
- 令牌有自然过期、使用刷新令牌、被主动撤销三种生命周期。
- 对第三方软件来说,令牌仍是不透明的,核心服务需要关注令牌。
- JWT 适合需要安全传输信息而不依赖状态的场景。
如何安全、快速接入OAuth 2
关于第三方软件和受保护资源服务接入OAuth 2.0,可以概括以下要点:
- 第三方软件需要关注注册信息、引导授权、使用访问令牌、使用刷新令牌。
- 引导授权时需要将用户重定向到授权服务进行授权。
- 使用访问令牌时,建议采用表单参数的方式提交,而不是URI查询参数或请求头字段。
- 使用刷新令牌时需要注意访问令牌的有效期,避免频繁重新授权。
- 受保护资源服务需要校验访问令牌并关注权限范围,常见的包括不同的权限对应不同的操作、数据、用户。
- 可以使用API网关统一处理权限校验,避免每个资源服务重复这部分逻辑。
- 第三方软件关心获取和使用令牌,资源服务关心校验令牌和权限控制。
- 两者只需关注自身职责,不必处理OAuth 2.0的全部复杂流程。
OAuth2的授权类型
OAuth 2.0 中定义了4种授权类型:
授权码许可(Authorization Code Grant)
通过授权码临时凭证获取访问令牌,流程最完整、安全性最高。
隐式许可(Implicit Grant)
直接在前端通信中返回访问令牌,无需授权码。适用于纯前端应用。
资源拥有者密码凭证许可(Resource Owner Password Credentials Grant)
使用用户名密码直接获取访问令牌。适用于高度信任的官方软件。
客户端凭证许可(Client Credentials Grant)
客户端直接通过app_id和app_secret获取访问令牌,无需用户参与。适用于访问公共数据。
这4种授权类型的主要区别在于获取访问令牌的方式不同。在选择授权类型时,需要根据应用场景和安全性要求进行权衡,优先考虑安全性较高的授权码许可类型。
关于OAuth2.0的四种授权类型,可以概括以下关键点:
- 授权码许可类型是流程最完备、安全性最高的授权方式。
- 资源拥有者凭据许可适用于官方软件,使用用户名密码获取令牌。
- 客户端凭据许可适用于获取公共数据,使用app_id和app_secret获取令牌。
- 隐式许可适用于纯浏览器端应用,直接在前端返回访问令牌。
- 在选择授权类型时,优先考虑授权码许可,然后结合实际场景选择最适合的类型。
- 获取访问令牌的方式是四种授权类型的最大区别。
- 所有类型都旨在解决实际场景下的授权问题,需要根据具体情况选择。
- 在非浏览器环境下,可以考虑客户端凭据许可或资源拥有者凭据许可。
- 按照安全性优先的原则,选择最适合的授权类型。