调整 IAM

This commit is contained in:
2026-09-16 08:50:24 +08:00
parent cbc7e16453
commit 8207afe04f
2 changed files with 19 additions and 11 deletions
@@ -85,7 +85,6 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter {
private static final String GRANT_TYPE = "iam_sso"; private static final String GRANT_TYPE = "iam_sso";
private static final String IAM_GRANT_TYPE = "authorization_code"; private static final String IAM_GRANT_TYPE = "authorization_code";
private static final String IAM_TOKEN_URI = "/iam/sso/token"; private static final String IAM_TOKEN_URI = "/iam/sso/token";
private static final String BEARER_PREFIX = "Bearer ";
private static final String BASIC_PREFIX = "Basic "; private static final String BASIC_PREFIX = "Basic ";
private static final String IAM_DEFAULT_DICT_CODE = "iam_default"; private static final String IAM_DEFAULT_DICT_CODE = "iam_default";
private static final String IAM_DEFAULT_ROLE_NAME = "默认角色"; private static final String IAM_DEFAULT_ROLE_NAME = "默认角色";
@@ -339,12 +338,16 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter {
private IamSsoProfileResponse requestIamProfile(String accessToken) { private IamSsoProfileResponse requestIamProfile(String accessToken) {
try { try {
HttpRequest httpRequest = HttpRequest.newBuilder(URI.create(buildProfileUrl(accessToken))) HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(URI.create(buildProfileUrl(accessToken)))
.timeout(Duration.ofSeconds(10)) .timeout(Duration.ofSeconds(10))
.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.header(HttpHeaders.AUTHORIZATION, profileAuthorizationHeader(accessToken)) // 与 IAM 同步接口一致:Authorization 走网关凭证,Auth 走业务凭证。
.GET() .header(HttpHeaders.AUTHORIZATION, authorizationHeader());
.build(); String profileAuthHeader = profileAuthHeader();
if (StringUtil.isNotBlank(profileAuthHeader)) {
requestBuilder.header("Auth", profileAuthHeader);
}
HttpRequest httpRequest = requestBuilder.GET().build();
log.info("IAM统一身份认证获取用户信息请求,url={}, method={}", properties.getProfileUrl(), httpRequest.method()); log.info("IAM统一身份认证获取用户信息请求,url={}, method={}", properties.getProfileUrl(), httpRequest.method());
HttpResponse<String> response = httpClient.send( HttpResponse<String> response = httpClient.send(
httpRequest, httpRequest,
@@ -352,7 +355,7 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter {
); );
log.info("IAM统一身份认证获取用户信息响应,status={}", response.statusCode()); log.info("IAM统一身份认证获取用户信息响应,status={}", response.statusCode());
if (response.statusCode() < 200 || response.statusCode() >= 300) { if (response.statusCode() < 200 || response.statusCode() >= 300) {
log.warn("IAM统一身份认证获取用户信息失败,status={}", response.statusCode()); log.warn("IAM统一身份认证获取用户信息失败,status={}, body={}", response.statusCode(), response.body());
throw new UserInvalidException(OAuth2TokenConstant.TOKEN_NOT_CORRECT); throw new UserInvalidException(OAuth2TokenConstant.TOKEN_NOT_CORRECT);
} }
return objectMapper.readValue(response.body(), IamSsoProfileResponse.class); return objectMapper.readValue(response.body(), IamSsoProfileResponse.class);
@@ -420,11 +423,15 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter {
return BASIC_PREFIX + authorization; return BASIC_PREFIX + authorization;
} }
private String profileAuthorizationHeader(String accessToken) { /**
if (StringUtil.isNotBlank(properties.getProfileAuthorization())) { * IAM 业务侧 Auth 头。网关 Authorization 使用 {@link #authorizationHeader()}
return withBasicPrefix(properties.getProfileAuthorization()); * 用户令牌通过 query 参数 access_token 传递。
*/
private String profileAuthHeader() {
if (StringUtil.isBlank(properties.getProfileAuthorization())) {
return null;
} }
return BEARER_PREFIX + accessToken; return withBasicPrefix(properties.getProfileAuthorization());
} }
private String encode(String value) { private String encode(String value) {
@@ -78,7 +78,8 @@ public class IamSsoProperties {
private String authorization; private String authorization;
/** /**
* IAM用户信息认证头。为空时默认使用 Bearer accessToken * IAM业务侧 Auth 请求头。为空时不传 Auth;
* Authorization 统一使用网关凭证 {@link #authorization}。
*/ */
private String profileAuthorization; private String profileAuthorization;