# huaweicloud-iam-idtoken-java **Repository Path**: HuaweiCloudDeveloper/huaweicloud-iam-idtoken-java ## Basic Information - **Project Name**: huaweicloud-iam-idtoken-java - **Description**: 获取联邦认证token(OpenID Connect ID token方式) - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master-dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-07-10 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1.功能介绍 该场景可以用于通过OpenID Connect ID token方式获取联邦认证token。 ## 2.前提条件 2.1获取AK/SK与其他参数 开发者在使用前需先获取账号的ak、sk、domainId、xIdpId、idToken等字段(每个字段在demo中有详细文字描述,参见代码)。 * domainId:账号ID。 * xIdpId:身份提供商Id。 * idToken:id_token信息。id_token由企业IdP构建,携带联邦用户身份信息。请参考[企业IdP](https://support.huaweicloud.com/usermanual-iam/iam_08_0001.html)文档了解获取id_token的方法。 您需要拥有华为云账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)。 请在华为云控制台“我的凭证-访问密钥”页面上创建和查看您的 AK/SK,更多信息请查看[访问密钥](https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html)。 2.2SDK的获取和安装 您可以通过如下方式获取和安装 SDK:通过 Maven 安装项目依赖是使用 Java SDK 的推荐方法。 首先您需要在您的操作系统中下载并安装 Maven ,安装完成后您只需在 Java 项目的 pom.xml 文件加入相应的依赖项即可。本示例使用IAM SDK: com.huaweicloud.sdk huaweicloud-sdk-iam 3.1.28 2.3通用准备 2.3.1导入依赖模块部分示例 import com.huaweicloud.sdk.core.auth.GlobalCredentials; import com.huaweicloud.sdk.core.exception.ClientRequestException; import com.huaweicloud.sdk.core.http.HttpConfig; import com.huaweicloud.sdk.core.utils.StringUtils; 2.3.2配置客户端属性 HttpConfig config = HttpConfig.getDefaultHttpConfig(); config.withIgnoreSSLVerification(true); // 如果是本地IDEA调试,需要使用代理,代码如下: // config.setProxyHost(""); // config.setProxyPort(); // config.setProxyUsername(""); // config.setProxyPassword(""); 2.3.3创建认证 GlobalCredentials auth = new GlobalCredentials() .withAk(ak) .withSk(sk) .withDomainId(domainId); 2.3.4创建请求客户端 ArrayList endpoints = new ArrayList(); endpoints.add("https://iam.myhuaweicloud.com"); IamClient client = IamClient.newBuilder() .withCredential(auth) .withEndpoints(endpoints) .withHttpConfig(config).build(); ## 3.运行环境 Java JDK 1.8 及其以上版本。 ## 4.关键代码 public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String domainId = ""; // 租户id:domainId,必传 // 配置客户端属性 HttpConfig config = HttpConfig.getDefaultHttpConfig(); config.withIgnoreSSLVerification(true); // 创建认证 GlobalCredentials auth = new GlobalCredentials() .withAk(ak) .withSk(sk) .withDomainId(domainId); // 创建请求客户端 ArrayList endpoints = new ArrayList(); endpoints.add(""); // 固定值,填入:https://iam.myhuaweicloud.com IamClient client = IamClient.newBuilder() .withCredential(auth) .withEndpoints(endpoints) .build(); // 获取联邦认证token(OpenID Connect ID token方式) createTokenWithIdToken(client); } private static void createTokenWithIdToken(IamClient client) { String xIdpId = ""; // 身份提供商Id。必传 String idToken = ""; // id_token信息。必传 // 获取unscoped token,下面四个参数都不传,否则根据下面条件传入 String scopeDomainId = ""; // 获取联邦认证project scoped token,同时填入projectId和projectName String scopeDomainName = ""; String scopeProjectId = ""; // 获取联邦认证domain scoped token,同时填入projectId和projectName String scopeProjectName = ""; // 构造请求 CreateTokenWithIdTokenRequest request = new CreateTokenWithIdTokenRequest(); // 请求对象 GetIdTokenAuthParams authbody = new GetIdTokenAuthParams(); // authbody用于存放各种请求体参数 // 设置scope信息 GetIdTokenIdScopeBody scopeAuth = new GetIdTokenIdScopeBody(); // scope对象 if (!StringUtils.isEmpty(scopeProjectId) && !StringUtils.isEmpty(scopeProjectName)) { GetIdTokenScopeDomainOrProjectBody projectScope = new GetIdTokenScopeDomainOrProjectBody(); projectScope.withId(scopeProjectId).withName(scopeProjectName); // scope为project,设置projectId和projectName scopeAuth.withProject(projectScope); authbody.withScope(scopeAuth); // 设置scope } else if (!StringUtils.isEmpty(scopeDomainId) && !StringUtils.isEmpty(scopeDomainName)) { GetIdTokenScopeDomainOrProjectBody domainScope = new GetIdTokenScopeDomainOrProjectBody(); domainScope.withId(scopeDomainId).withName(scopeDomainName); scopeAuth.withDomain(domainScope); authbody.withScope(scopeAuth); // 设置scope } request.withXIdpId(xIdpId); // 请求头设置X-Idp-Id GetIdTokenIdTokenBody idTokenAuth = new GetIdTokenIdTokenBody(); idTokenAuth.withId(idToken); authbody.withIdToken(idTokenAuth); // 设置id_token GetIdTokenRequestBody body = new GetIdTokenRequestBody(); // 请求体对象 body.withAuth(authbody); request.withBody(body); try { // 执行请求 CreateTokenWithIdTokenResponse response = client.createTokenWithIdToken(request); logger.info(response.toString()); } catch (ClientRequestException e) { LogError(e); } } private static void LogError(ClientRequestException e) { logger.error("HttpStatusCode: " + e.getHttpStatusCode()); logger.error("RequestId: " + e.getRequestId()); logger.error("ErrorCode: " + e.getErrorCode()); logger.error("ErrorMsg: " + e.getErrorMsg()); } } ## 5.如何运行 该场景可以用于通过OpenID Connect ID token方式获取联邦认证token。替换参数后,执行Run启动main方法即可。 ## 6.返回结果示例 返回结果示例:通过OpenID Connect ID token方式获取联邦认证token { token: class ScopedTokenInfo { expiresAt: 2023-07-26T11:04:57.547000Z methods: [mapped] issuedAt: 2023-07-25T11:04:57.547000Z user: class FederationUserBody { osFederation: class OsFederationInfo { identityProvider: class IdpIdInfo { id: lzp*****idc } protocol: class ProtocolIdInfo { id: oi**dc } groups: [] } domain: class DomainInfo { id: 3d63*******************9802 name: li****xun } id: yaoYn***********************PzMM name: Fed*********er } domain: null project: null roles: [] catalog: [] } xSubjectToken: MIIDegYJKoZIhv... } ## 7.其他语言版本的说明 本代码参考华为云API Explorer的代码示例开发Java语言版本,对接SDK,如需使用其他版本,亦可参考华为云API Explorer提供的其他语言代码示例,链接如下: * [获取联邦认证token(OpenID Connect ID token方式)](https://console.huaweicloud.com/apiexplorer/#/openapi/IAM/sdk?api=CreateTokenWithIdToken) ## 8.修订记录 | 发布日期 | 文档版本 | 修订说明 | |---------| ------------ | ------------ | | 2023-08 | 1.0 | 文档首次发布 |