You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Authorization Server中ID Token缺失SID声明的解决问询

解决Spring Authorization Server 1.1.2用户名密码登录ID Token缺失SID声明问题

问题原因

SID(Session ID)是标识用户会话的关键声明,用于登出流程定位会话。用户名密码登录流程默认未自动注入该声明,而超级管理员代登、Azure AD登录等场景因依赖外部认证或特定会话处理逻辑,自动包含了SID。

解决方案

1. 自定义JWT Token定制器

创建类实现OAuth2TokenCustomizer<JwtEncodingContext>,在ID Token生成时手动添加SID声明:

import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;

@Component
public class SidTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {

    @Override
    public void customize(JwtEncodingContext context) {
        // 仅对ID Token添加SID声明
        if ("id_token".equals(context.getTokenType().getValue())) {
            HttpServletRequest request = context.getHttpRequest().get();
            String sessionId = request.getSession().getId();
            context.getClaims().claim("sid", sessionId);
        }
    }
}

2. 注册定制器到授权服务器配置

在授权服务器配置类中,将自定义的Token定制器绑定到JWT编码器:

import org.springframework.context.annotation.Bean;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
import org.springframework.security.oauth2.server.authorization.token.JwtEncoder;

@Configuration
public class AuthorizationServerConfig {

    private final SidTokenCustomizer sidTokenCustomizer;

    public AuthorizationServerConfig(SidTokenCustomizer sidTokenCustomizer) {
        this.sidTokenCustomizer = sidTokenCustomizer;
    }

    @Bean
    public OAuth2AuthorizationServerConfigurer authorizationServerConfigurer() {
        return new OAuth2AuthorizationServerConfigurer()
                .token(tokenConfig -> tokenConfig
                        .jwt(jwtConfig -> jwtConfig
                                .encoder(jwtEncoder())
                                .customizer(sidTokenCustomizer)));
    }

    // 实现你的JWT编码器,例如基于Nimbus的实现
    @Bean
    public JwtEncoder jwtEncoder() {
        // 此处替换为你的JwtEncoder具体实现逻辑
        // 示例:return new NimbusJwtEncoder(jwkSource);
    }
}

3. 验证配置有效性

完成配置后,使用用户名密码登录获取ID Token,解析后确认sid声明已存在。此时即可基于该SID触发正常的登出流程。

内容的提问来源于stack exchange,提问作者user7090887

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:25:01