package com.ard.sample.utils; import com.ard.oss.model.CredentialsDTO; import io.minio.credentials.AssumeRoleProvider; import lombok.extern.slf4j.Slf4j; import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import org.springframework.stereotype.Component; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.security.NoSuchAlgorithmException; import java.security.ProviderException; import java.util.concurrent.TimeUnit; import static com.ard.sample.config.DockConfiguration.*; /** * 获取http的STS凭证的工具类,用于简化STS临时凭证的获取过程。 */ @Slf4j @Component public class MinioStsUtils { public CredentialsDTO getCredentials() { try { // 构建适配HTTP协议的OkHttpClient(移除所有SSL相关配置) OkHttpClient httpClient = new OkHttpClient.Builder() // 保留原代码的连接池配置(禁用连接复用,如需复用可删除此行) .connectionPool(new ConnectionPool(5, 30, TimeUnit.SECONDS)) .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 .readTimeout(30, TimeUnit.SECONDS) // 读取超时 .writeTimeout(30, TimeUnit.SECONDS) // 写入超时 .build(); // 构建 AssumeRoleProvider,使用简化后的HTTP客户端 String roleSessionName = "dji-sts-session-" + System.currentTimeMillis(); // 唯一会话名称(必需,避免重复) AssumeRoleProvider provider = new AssumeRoleProvider( endpoint, // 注意:此处endpoint需改为HTTP地址(如 http://sts.example.com) accessKey, // 主账号AccessKey secretKey, // 主账号SecretKey Math.toIntExact(expire), // 凭证过期时间(转int) null, // 可选参数(如RoleArn,根据实际SDK调整) region, // 地域(如cn-hangzhou) null, roleSessionName, null, // 其他可选参数 httpClient // 传入HTTP版本的OkHttpClient ); log.info("生成临时凭证条件:{}",provider); // 获取 STS 临时凭证 var stsCredentials = provider.fetch(); return new CredentialsDTO(stsCredentials, expire); } catch (ProviderException e) { log.error("Failed to fetch/parse STS response (HTTP access)", e); throw new RuntimeException("STS response parse failed", e); } catch (NoSuchAlgorithmException e) { log.error("Failed to fetch/parse STS response (HTTP access)", e); throw new RuntimeException(e); } } }