OAuth2.0知识总结
- OAuth 2.0是一种授权协议,核心是获取和使用访问令牌。
- 授权码许可流程需要引入授权码,既保证安全又实现用户体验。
- OAuth 2.0也可视为一种委托协议,用户委托第三方软件代表操作。
- 授权码许可流程是OAuth 2.0中最完备、安全的授权方式。
- 使用不当会引发安全问题,需要遵守各项规范细节。
- 需要使用HTTPS保证通信安全。
- JWT不是OAuth 2.0的组成部分,是对其的扩展。
- OAuth 2.0提供框架,OIDC在其上实现身份认证。
- 第三方软件和平台方都需提高安全意识,保障OAuth 2.0安全。
- OAuth 2.0是解决授权和身份认证问题的有效工具。
移动APP接入OAuth2
移动App使用OAuth 2.0的要点总结如下:
- 移动App可分为无服务端和有服务端两类,后者使用OAuth 2.0更安全。
- 无服务端App可以用PKCE协议防止授权码泄露,但不建议 敏感信息如app_secret。
- 有服务端App可以通过服务端获取访问令牌,与Web应用流程类似,安全性高。
- 微信等平台都建议移动App使用后台服务获取访问令牌。
- 使用微信登录等第三方登录时,App获取授权码,服务端使用code和app_secret获取访问令牌。
- 不建议在App端保存敏感信息,使用服务端可以避免安全问题。
- PKCE协议可在一定程度上保障无服务端App的安全性。
- 建议移动App尽可能使用服务端和后台通信获取访问令牌。
- OAuth 2.0核心思想可应用到App中,通过安全使用保障数据安全。
安全风险和防范措施
OAuth 2.0的安全风险及防范措施可以概括以下几点:
- CSRF攻击可以通过状态参数state进行防范。
- XSS攻击需要对响应内容进行转义处理防止注入恶意代码。
- 水平越权需要校验数据归属关系,避免不同用户的数据混淆。
- 授权码失窃需要校验app_id并立即作废使用过的授权码。
- 重定向URI篡改需要对URI做完整性校验。
- 需要遵守OAuth 2.0各项规范细节以保障安全。
- 开发人员安全意识不够是导致这些漏洞的常见原因。
- 从攻击方考虑也有助于发现更多风险因素。
- OAuth 2.0也面临互联网中的通用安全风险。
- 安全防范需要全面考虑各种可能的攻击场景。
利用OAuth2 实现OIDC
使用OAuth 2.0实现OIDC可以概括以下要点:
- OIDC是一种开放的用户身份认证标准协议,是在OAuth 2.0的基础上构建的。
- OIDC新增了ID令牌,用于传递用户标识信息,第三方软件可以用它记录用户登录状态。
- OIDC还新增了UserInfo端点,用于第三方软件获取更多用户信息。
- ID令牌是一个JWT格式的令牌,包含iss、sub、aud、exp等必要声明信息。
- 第三方软件只需解析ID令牌的payload部分,获取用户标识等信息。
- 单点登录就是OIDC协议的一种应用场景。
- OAuth 2.0提供基础的授权框架,OIDC在其上实现身份认证。
- 实现OIDC需要注意ID令牌的安全性、UserInfo信息获取等。
- OIDC提供了一个标准的身份认证解决方案。
Spring Security 实现OAuth 2.0
使用 Spring Security 实现 OAuth 2.0 的要点:
- 授权服务器使用 JdbcAuthorizationCodeServices 存储授权码,JwtTokenStore 存储 JWT 令牌。
- 资源服务器通过本地公钥验证 JWT 令牌,并校验权限。
- 支持资源拥有者凭据许可、客户端凭据许可、授权码许可三种模式。
- 可以增加 TokenEnhancer 向 JWT 令牌中添加额外信息。
- 通过授权码许可实现单点登录,OAuth2RestTemplate 调用资源服务器。
- 客户端需要配置客户端信息、令牌端点、授权端点、重定向URI等。
- 安全配置需要开放登录页、授权页的访问权限。
- 注意使用 HTTPS 传输令牌,避免 CSRF 攻击等安全风险。
- Spring Security OAuth 2.0 使用简单,但需要理解工作流程。
基于OAuth2的微服务架构
使用OAuth 2.0/JWT的微服务参考架构要点:
- 微服务可以分为5层:流量入口层、Web应用层、网关层、BFF层和领域服务层。
- 网关层承担关键的安全功能:校验和转换OAuth访问令牌,以及基于Scope鉴权。
- 典型的应用场景包括:第一方Web应用、第一方移动应用、第三方Web应用。
- IDP服务负责OAuth协议处理、令牌管理、用户认证。
- 前端通过OAuth访问令牌认证,后端通过包含用户信息的JWT令牌认证。
- 网关在两种令牌之间转换,实现混合使用。
- 与传统Web应用不同,微服务强调服务自治、弹性伸缩、无状态。
- 微服务安全力求零认证、细粒度鉴权、无状态会话。
- 理解微服务安全机制有助于部署运维OAuth 2.0。
开放平台如何使用Oauth2
- 开放平台体系的整体结构:
- 第三方软件:第三方开发者或者 ISV 通过对接开放平台来实现的应用软件。
- 开放平台:包含 API 网关服务、OAuth 2.0 授权服务和第三方软件开发者中心服务。
- 受保护资源服务:开放平台提供的 API 服务,需要经过 OAuth 2.0 授权才能被访问。
- 各大开放平台的授权流程:
- 推荐使用授权码许可流程。
- 微信、支付宝、美团等开放平台的授权流程图中都有授权码 code 相关的文字。
- 授权码流程中的参数说明:
- 重定向过程用到的参数:response_type、client_id、redirect_uri。
- 授权端点响应小兔软件用到的参数:code、state。
- 申请访问令牌需要传递的基本参数:grant_type、client_id、client_secret、code。
- 令牌端点响应小兔软件涉及的参数:access_token、token_type、expires_in、refresh_token、scope。