基于Okta OIDC的Spring传统应用SSO用户信息获取求助
解决方案
核心问题说明
你当前使用的Okta Bookmark App本质只是跳转链接,默认不会携带用户身份信息。必须将应用配置为OIDC Web应用,通过OAuth2 Authorization Code Flow完成身份传递,才能在Spring后端获取到用户的邮箱、用户名及自定义声明等信息。
步骤1:重新配置Okta应用
- 登录Okta控制台,删除原Bookmark App,创建新的OIDC - Web Application
- 配置关键参数:
- 登录重定向URI:填写Spring应用的回调地址,示例:
http://localhost:8080/login/oauth2/code/okta - 授予类型:勾选
Authorization Code - 可选配置注销重定向URI,示例:
http://localhost:8080/logout
- 登录重定向URI:填写Spring应用的回调地址,示例:
- 保存后,记录下Client ID、Client Secret及你的Okta域名(
https://dev-XXXXXXX.okta.com)
步骤2:Spring后端集成配置(非Spring Boot)
2.1 添加依赖
在Maven的pom.xml中加入Spring Security OAuth2相关依赖:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> <version>5.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> <version>5.0.0.RELEASE</version> </dependency>
2.2 配置Spring Security
创建Spring Security配置类,启用OAuth2客户端认证:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.core.ClientAuthenticationMethod; import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login() .defaultSuccessUrl("/oktalogin", true); // 认证成功后跳转至你的目标路径 } // 配置Okta客户端注册信息 public ClientRegistrationRepository clientRegistrationRepository() { return new InMemoryClientRegistrationRepository(oktaClientRegistration()); } private ClientRegistration oktaClientRegistration() { return ClientRegistration.withRegistrationId("okta") .clientId("你的Okta Client ID") .clientSecret("你的Okta Client Secret") .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}") .scope("openid", "profile", "email") // 请求用户基础信息、邮箱权限 .authorizationUri("https://dev-XXXXXXX.okta.com/oauth2/v1/authorize") .tokenUri("https://dev-XXXXXXX.okta.com/oauth2/v1/token") .userInfoUri("https://dev-XXXXXXX.okta.com/oauth2/v1/userinfo") .userNameAttributeName(IdTokenClaimNames.SUB) .jwkSetUri("https://dev-XXXXXXX.okta.com/oauth2/v1/keys") .clientName("Okta") .build(); } }
步骤3:在oktalogin控制器中获取用户信息
认证成功后,Spring Security会自动将用户身份信息封装到OAuth2User对象中,你可以直接通过注解获取:
import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletRequest; @Controller public class OktaLoginController { @GetMapping("/oktalogin") public String handleOktaLogin(@AuthenticationPrincipal OAuth2User oauth2User, HttpServletRequest request) { // 获取用户名 String username = oauth2User.getAttribute("preferred_username"); // 获取邮箱 String email = oauth2User.getAttribute("email"); // 获取自定义声明属性(替换为你的自定义声明字段名) String customAttr = oauth2User.getAttribute("你的自定义声明名"); // 将用户信息存入request,供JSP页面使用 request.setAttribute("userInfo", oauth2User.getAttributes()); return "你的目标JSP页面名称"; // 跳转至业务页面 } }
额外说明
- 若需要获取自定义声明,需在Okta控制台的OIDC应用配置中,添加ID Token Claims,确保自定义字段在授权时返回给客户端。
- 不推荐继续使用Bookmark App传递用户信息,因为无法保证安全性;若坚持使用,需手动在跳转URL中拼接明文
id_token,但存在泄露风险。
内容的提问来源于stack exchange,提问作者ma hei pang
相关产品推荐
相关产品推荐

