Spring Boot+OAuth2,如何自定义返回的 Token 信息

本文讲述了如何在OAuth2框架中自定义access_token的返回信息,包括透明JWT和不透明令牌的区别,以及如何通过修改DefaultOAuth2AccessToken来扩展额外信息。作者分享了在SpringCloud项目中安全管理的思路,涉及单点登录和第三方登录功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • access_token

  • token_type

  • refresh_token

  • expires_in

  • scope

具体如下:

{

“access_token”: “b9c9e345-90c9-49f5-80ab-6ce5ed5a07c9”,

“token_type”: “bearer”,

“refresh_token”: “9f843e0e-1778-495d-859a-52a1a806c150”,

“expires_in”: 7199,

“scope”: “seller-auth”

}

但是在实际操作中,我们往往需要在这个基础上,定制自己的返回信息,这就需要我们对这个东西进行自定义。本文松哥就来和大家聊一聊这里要如何自定义。

敲黑板划重点: 本文还是我们最近 OAuth2 系列的延续,如果没看过本系列之前的文章,一定先阅读一下,这有助于更好的理解本文:

  1. 做微服务绕不过的 OAuth2,松哥也来和大家扯一扯

  2. 这个案例写出来,还怕跟面试官扯不明白 OAuth2 登录流程?

  3. 死磕 OAuth2,教练我要学全套的!

  4. OAuth2 令牌还能存入 Redis ?越玩越溜!

  5. 想让 OAuth2 和 JWT 在一起愉快玩耍?请看松哥的表演

  6. 最近在做 Spring Cloud 项目,松哥和大家分享一点微服务架构中的安全管理思路

  7. Spring Boot+OAuth2,一个注解搞定单点登录!

  8. 分分钟让自己的网站接入 GitHub 第三方登录功能

好了,不废话了,我们来看今天的内容。

1.access_token 从哪里来


首先我们要搞清楚,access_token 从哪里来。

在前面的文章中,我们在生成 access_token 的时候,都配置了一个类,叫做 AuthorizationServerTokenServices,如下:

@Bean

AuthorizationServerTokenServices tokenServices() {

DefaultTokenServices services = new DefaultTokenServices();

services.setClientDetailsService(clientDetailsService());

services.setSupportRefreshToken(true);

services.setTokenStore(tokenStore);

TokenEnhancerChain chain = new TokenEnhancerChain();

chain.setTokenEnhancers(Arrays.asList(jwtAccessTokenConverter,externalAccessTokenInfo));

services.setTokenEnhancer(chain);

return services;

}

在这个配置中,我们提供了一个 DefaultTokenServices 实例,这个实例就是默认生成 access_token 的工具,我们进入到 DefaultTokenServices#createAccessToken 方法中,一路追踪,可以看到如下代码:

private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {

DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());

int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request());

if (validitySeconds > 0) {

token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L)));

}

token.setRefreshToken(refreshToken);

token.setScope(authentication.getOAuth2Request().getScope());

return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;

}

从这段代码中,我们可以看到,用来保存 access_token 的实例,其实就是 DefaultOAuth2AccessToken,我们再来看看 DefaultOAuth2AccessToken 的定义:

public class DefaultOAuth2AccessToken implements Serializable, OAuth2AccessToken {

private String value;

private Date expiration;

private String tokenType = BEARER_TYPE.toLowerCase();

private OAuth2RefreshToken refreshToken;

private Set scope;

private Map<String, Object> additionalInformation = Collections.emptyMap();

//省略其他

}

从这段属性的声明中,我们就可以看出来,为什么默认返回的数据只有五项。

大家同时也发现,DefaultOAuth2AccessToken 中其实是提供了一个 additionalInformation 属性用来存储额外信息的,但是,我们在 DefaultTokenServices 类中并没有办法去自定义 DefaultOAuth2AccessToken 中的属性,也就是说,默认情况下,我们没有办法自己去给 additionalInformation 中添加值。

虽然默认情况下,无法添加,但是只要大家看了上面这段源码,就会明白,如果我们想要自定义返回的 access_token 信息,就要想办法自已去定义 DefaultOAuth2AccessToken 信息。

思路有了,接下来看操作。

2.两种定制方案


大家知道,我们在 OAuth2 中返回的令牌信息分为两大类:不透明令牌和透明令牌。

不透明令牌就是一种无可读性的令牌,一般来说就是一段普通的 UUID 字符串。不透明令牌的最大问题在于会降低系统性能和可用性,并且增加延迟(因为必须远程校验令牌)。

透明令牌的典型代表就是 JWT 了,用户信息都保存在 JWT 字符串中,关于 JWT 的信息,大家可以参考这篇文章:想让 OAuth2 和 JWT 在一起愉快玩耍?请看松哥的表演
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-NXoQpmuc-1712192783584)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

### Spring Boot 2 中通过集成 Spring Security 和 OAuth2 实现单点登录 (SSO) #### 1. 添加必要的依赖项 为了实现基于 Spring Boot 的 SSO 功能,需要引入 `spring-boot-starter-security` 和 `spring-cloud-starter-oauth2` 这两个核心依赖。以下是 Maven 配置中的示例: ```xml <dependencies> <!-- Spring Boot Starter Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- Spring Cloud OAuth2 Support --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> </dependencies> ``` 此部分配置确保项目能够支持 OAuth2 认证机制并提供自动化的安全功能[^1]。 --- #### 2. 创建认证服务器 创建一个独立的服务作为认证服务器,负责管理用户的令牌发放和验证逻辑。在该服务中定义如下配置类: ```java @Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("client-id") // 客户端ID .secret("{noop}client-secret") // 客户端密钥 .authorizedGrantTypes("authorization_code", "refresh_token", "password") .scopes("read", "write"); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager); } } ``` 上述代码片段展示了如何设置内存中的客户端详情以及授权模式的支持情况[^3]。 --- #### 3. 配置资源服务器 对于需要保护的应用程序(即资源服务器),需指定其受保护的 URL 路径,并声明所使用的认证方式为 OAuth2: ```java @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/public/**").permitAll() // 公开接口无需身份验证 .anyRequest().authenticated(); // 所有其他请求均需经过身份验证 } } ``` 这段代码明确了哪些 API 是公开访问的,而其余则强制执行用户身份验证过程。 --- #### 4. 启用单点登录功能 在实际业务系统的入口处启用 SSO 支持,通常是在主启动类上添加特定注解完成初始化工作: ```java @SpringBootApplication @EnableOAuth2Sso public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 借助于 `@EnableOAuth2Sso` 注解的作用,Spring Boot 将会自动生成一系列默认行为来简化开发者的操作流程[^2]。 --- #### 5. 应用属性文件调整 最后一步是对 application.yml 或者 application.properties 文件做出相应修改,以便适配外部 OAuth 提供商的具体参数设定: ```yaml security: oauth2: client: clientId: your-client-id-here clientSecret: your-client-secret-here accessTokenUri: https://example.com/oauth/token userAuthorizationUri: https://example.com/oauth/authorize resource: userInfoUri: https://example.com/userinfo ``` 以上 YAML 片段指定了与远程 OAuth 授权服务器交互所需的关键字段值集合。 --- ### 总结 综上所述,在 Spring Boot 2 环境下结合 Spring Security 及 OAuth2 技术栈可以轻松达成跨多个子域下的统一账户管理体系目标。整个架构设计围绕着集中式的 Token 发放中心展开,从而有效减少了重复性的密码输入动作频率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值