spring security oauth2.0的四种模式

OAuth 2.0 定义了 4 种授权模式(Grant Type),用于不同场景下的令牌获取。以下是每种模式的详细说明、适用场景和对比:


一、授权码模式(Authorization Code Grant)

适用场景

• Web 应用 (有后端服务器)

• 移动端应用 (需安全存储 client_secret)

• 最安全的模式,推荐公开客户端使用

流程

用户 客户端 授权服务器 资源服务器 访问客户端 重定向到授权服务器 登录并授权 重定向回客户端(携带授权码 code) 传递 code 用 code 换取令牌(client_id + client_secret) 返回访问令牌(access_token)和刷新令牌(refresh_token) 用 access_token 访问资源 用户 客户端 授权服务器 资源服务器

特点

• 令牌不暴露给浏览器(通过后端交换)

• 支持 refresh_token

• 需预注册 redirect_uri 防止钓鱼攻击


二、隐式模式(Implicit Grant)

适用场景

• 单页应用(SPA) 或纯前端应用

• 无后端服务器 的场景

• 已被 OAuth 2.1 废弃(建议用授权码模式 + PKCE 替代)

流程

用户 客户端 授权服务器 资源服务器 访问客户端 重定向到授权服务器 登录并授权 重定向回客户端(URL 片段携带 access_token) 前端提取 access_token 用 access_token 访问资源 用户 客户端 授权服务器 资源服务器

特点

• 直接返回 access_token(无中间授权码)

• 令牌通过 URL 片段传递(前端可见,存在泄露风险)

• 不支持 refresh_token


三、密码模式(Resource Owner Password Credentials Grant)

适用场景

• 受信任的客户端 (如公司内部系统)

• 用户需直接在客户端输入用户名/密码

• 高风险,仅限无法使用其他模式的场景

流程

用户 客户端 授权服务器 资源服务器 输入用户名和密码 发送用户名、密码、client_id、client_secret 返回 access_token 和 refresh_token 用 access_token 访问资源 用户 客户端 授权服务器 资源服务器

特点

• 用户需向客户端暴露密码(违反最小权限原则)

• 仅适用于高信任度环境(如内部系统)

• 支持 refresh_token


四、客户端凭证模式(Client Credentials Grant)

适用场景

• 服务器到服务器 的通信(无用户参与)

• 机器对机器(M2M)认证

• 访问与用户无关的公共资源

流程

客户端 授权服务器 资源服务器 发送 client_id 和 client_secret 返回 access_token 用 access_token 访问资源 客户端 授权服务器 资源服务器

特点

• 无用户参与

• 令牌权限范围由客户端注册时决定

• 不支持 refresh_token


五、模式对比与选型指南

模式 安全性 适用客户端类型 是否需要用户参与 令牌存储位置
授权码模式 ⭐⭐⭐⭐⭐ Web 应用、移动端(有后端) 是 后端安全存储
隐式模式 ⭐⭐ SPA(已过时) 是 前端存储(高风险)
密码模式 ⭐ 受信任的内部系统 是 后端存储
客户端凭证模式 ⭐⭐⭐⭐ 服务器到服务器 否 后端安全存储

六、最佳实践

  1. 优先使用授权码模式(尤其是公开客户端)
  2. 避免隐式模式(OAuth 2.1 已废弃,改用 PKCE 增强的授权码模式)
  3. 密码模式仅限高信任环境(如公司内部工具)
  4. 客户端凭证模式用于 M2M 场景(如定时任务、API 网关)
  5. 强制 HTTPS 防止令牌泄露

七、Spring Security 中实现示例

授权码模式配置(Google 登录):
yaml 复制代码
# application.yml
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-client-id
            client-secret: your-client-secret
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
客户端凭证模式配置:
java 复制代码
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
        ClientRegistrationRepository clientRegistrationRepository,
        OAuth2AuthorizedClientRepository authorizedClientRepository) {

    OAuth2ClientCredentialsGrantRequestEntityConverter converter = 
        new OAuth2ClientCredentialsGrantRequestEntityConverter();
    
    DefaultClientCredentialsTokenResponseClient client = 
        new DefaultClientCredentialsTokenResponseClient();
    client.setRequestEntityConverter(converter);

    AuthorizedClientServiceOAuth2AuthorizedClientManager manager = 
        new AuthorizedClientServiceOAuth2AuthorizedClientManager(
            clientRegistrationRepository, authorizedClientRepository);
    manager.setAuthorizedClientProvider(
        new ClientCredentialsOAuth2AuthorizedClientProvider());
    
    return manager;
}

通过理解这四种授权模式,您可以根据具体场景选择最合适的认证流程,平衡安全性与用户体验。

相关推荐
哦虎!3 小时前
【JavaEE】网络初识
java
for_ever_love__3 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
大鸡腿同学4 小时前
手心向上,手心向下
后端
我是人✓4 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡4 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
CCblandy4 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室5 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项5 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼5 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发