日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

管理訪問(wèn)憑據(jù)

更新時(shí)間:
重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。

當(dāng)您通過(guò)阿里云SDK調(diào)用OpenAPI進(jìn)行資源操作時(shí),必須正確配置憑證信息。阿里云的Credentials工具提供了一套強(qiáng)大的功能,使您能夠輕松地獲取和管理這些訪問(wèn)憑證。無(wú)論是利用默認(rèn)憑證,AccessKey(AK),還是安全令牌服務(wù)(STS)令牌等,Credentials工具都能為您提供相應(yīng)支持。此外,本文檔將詳細(xì)闡述如何根據(jù)優(yōu)先級(jí)使用默認(rèn)憑證。您將深入理解如何在阿里云SDK中配置和維護(hù)憑證,從而確保您對(duì)云資源的操作既有效率又具有高度安全性。

背景信息

憑據(jù)是指用戶證明其身份的一組信息。用戶在系統(tǒng)中進(jìn)行登錄時(shí),需要提供正確的憑據(jù)才能驗(yàn)證身份。常見(jiàn)的憑據(jù)類型有:

  1. 阿里云主賬號(hào)和RAM用戶的永久憑據(jù) AccessKey(簡(jiǎn)稱AK)是由AccessKey ID和AccessKey Secret組成的密鑰對(duì)。

  2. 阿里云RAM角色的STS臨時(shí)訪問(wèn)Token,簡(jiǎn)稱STS Token。它是可以自定義時(shí)效和訪問(wèn)權(quán)限的臨時(shí)身份憑據(jù),詳情請(qǐng)參見(jiàn)什么是STS。

  3. Bearer Token。它是一種身份驗(yàn)證和授權(quán)的令牌類型。

前提條件

安裝Credentials工具

Maven安裝方式。

<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>credentials-java</artifactId>
   <version>LATEST</version>
</dependency>
  1. 使用最新發(fā)布Credentials依賴包,確保所有憑證支持。

  2. 請(qǐng)查看ChangeLog.txt獲取所有已發(fā)布的版本列表。

  3. 建議優(yōu)先選用阿里云V2.0 SDK。如果選擇不使用阿里云V2.0 SDK,而是單獨(dú)依賴credentials-java,則務(wù)必引入下面的依賴,否則將出現(xiàn)錯(cuò)誤,無(wú)法找到com.aliyun.tea.TeaModel類文件。

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>tea</artifactId>
      <version>LATEST</version>
    </dependency>

初始化憑據(jù)客戶端

Credentials工具支持多種方式初始化憑據(jù)客戶端,您可根據(jù)實(shí)際情況選擇合適的方式進(jìn)行憑據(jù)客戶端初始化。

重要

在項(xiàng)目中使用明文AccessKey,容易因代碼倉(cāng)庫(kù)權(quán)限管理不當(dāng)造成AccessKey泄露,會(huì)威脅該賬號(hào)下所有資源的安全。建議通過(guò)環(huán)境變量、配置文件等方式獲取AccessKey。

方式一:使用默認(rèn)憑據(jù)鏈

當(dāng)您在初始化憑據(jù)客戶端不傳入任何參數(shù)時(shí),Credentials工具會(huì)使用默認(rèn)憑據(jù)鏈方式初始化客戶端。默認(rèn)憑據(jù)的讀取邏輯請(qǐng)參見(jiàn)默認(rèn)憑據(jù)鏈

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception{
        // 不指定參數(shù)
        Config credentialConfig = new Config();
        Client credentialClient = new Client(credentialConfig);
    }
}

接口調(diào)用方法

通過(guò)默認(rèn)憑據(jù)提供鏈自動(dòng)創(chuàng)建訪問(wèn)憑證,并在不使用硬編碼AccessKey的情況下成功調(diào)用云產(chǎn)品OpenAPI接口。

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用默認(rèn)憑證初始化Credentials Client。
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        Config ecsConfig = new Config();
        // 配置云產(chǎn)品服務(wù)接入地址(endpoint)。
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        // 使用 Credentials 配置憑證。
        ecsConfig.setCredential(credentialClient);
        // 初始化 ECS Client。
        Client ecsClient = new Client(ecsConfig);
        // 初始化 DescribeRegions 請(qǐng)求。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用 DescribeRegions 接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方式二:使用AK

阿里云賬號(hào)、RAM用戶可生成調(diào)用OpenAPI的密鑰對(duì)AK。如何獲取AK請(qǐng)參見(jiàn)文檔創(chuàng)建AccessKey。您可使用AK初始化憑據(jù)客戶端。

警告

阿里云主賬號(hào)擁有資源的全部權(quán)限,AK一旦泄露,會(huì)給系統(tǒng)帶來(lái)巨大風(fēng)險(xiǎn),不建議使用。

推薦使用最小化授權(quán)的RAM用戶的AK。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception{
        Config credentialConfig = new Config();
        credentialConfig.setType("access_key");
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        Client credentialClient = new Client(credentialConfig);
    }
}

接口調(diào)用方法

通過(guò)Credentials工具讀取AK,完成云產(chǎn)品OpenAPI接口的調(diào)用。

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用AK 初始化Credentials Client。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // 憑證類型。
        credentialsConfig.setType("access_key");
        // 設(shè)置為AccessKey ID值。
        credentialsConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // 設(shè)置為AccessKey Secret值。
        credentialsConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        Config ecsConfig = new Config();
        // 配置云產(chǎn)品服務(wù)接入地址(endpoint)。
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        // 使用Credentials配置憑證。
        ecsConfig.setCredential(credentialClient);
        // 初始化ECS Client。
        Client ecsClient = new Client(ecsConfig);
        // 初始化DescribeRegions請(qǐng)求。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方式三:使用STS Token

以一個(gè)RAM用戶的身份調(diào)用STS服務(wù)的AssumeRole接口,設(shè)置Token的最大過(guò)期時(shí)間,即可換取到臨時(shí)憑據(jù)STS Token。以下示例演示如何使用STS Token初始化憑據(jù)客戶端(不包含如何獲取到STS Token的過(guò)程)。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) {
        Config credentialConfig = new Config();
        credentialConfig.setType("sts");
        // 從環(huán)境變量中獲取AccessKey ID的值
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // 從環(huán)境變量中獲取AccessKeySecret的值
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 從環(huán)境變量中獲取臨時(shí)SecurityToken的值
        credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        Client credentialClient = new Client(credentialConfig);
    }
}

接口調(diào)用方法

通過(guò)Credentials工具讀取臨時(shí)安全令牌(STS Token),完成云產(chǎn)品OpenAPI接口的調(diào)用。

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDKSTS SDK。

import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建StsClient對(duì)象,并調(diào)用assumeRole服務(wù)獲取STS Token
        Config config = new Config()
                // 從環(huán)境變量中獲取AccessKey ID的值
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 從環(huán)境變量中獲取AccessKey Secret的值
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); 
        config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
        Client client = new Client(config);
        AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
                // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_ARN設(shè)置RoleArn
                .setRoleArn("<RoleArn>")
                // 角色會(huì)話名稱,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設(shè)置RoleSessionName
                .setRoleSessionName("<RoleSessionName>"); 
        RuntimeOptions runtime = new RuntimeOptions();
        AssumeRoleResponse assumeRoleResponse = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
        AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;

        // 使用STS Token初始化Credentials Client。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        credentialsConfig.setType("sts"); // 憑證類型。
        credentialsConfig.setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId);
        credentialsConfig.setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret);
        credentialsConfig.setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // 使用Credentials創(chuàng)建ecs client。
        Config ecsConfig = new Config();
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        ecsConfig.setCredential(credentialClient);
        com.aliyun.ecs20140526.Client ecsClient = new com.aliyun.ecs20140526.Client(ecsConfig);
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        RuntimeOptions describeRegionsRuntime = new RuntimeOptions();

        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, describeRegionsRuntime);
        System.out.println(response.body.toMap());
    }
}

方式四:使用AK及RamRoleArn

該方式底層實(shí)現(xiàn)是STS Token。通過(guò)指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具可以幫助開(kāi)發(fā)者前往STS換取STS Token。您也可調(diào)用setPolicy函數(shù)限制RAM角色到一個(gè)更小的權(quán)限集合。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
  public static void main(String[] args) throws Exception {
    Config credentialConfig = new Config();
    credentialConfig.setType("ram_role_arn");
    credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
    credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_ARN設(shè)置RoleArn
    credentialConfig.setRoleArn("<RoleArn>");
    // 角色會(huì)話名稱,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設(shè)置RoleSessionName
    credentialConfig.setRoleSessionName("<RoleSessionName>");
    // 設(shè)置更小的權(quán)限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    credentialConfig.setPolicy("<Policy>");
    // Not required, the external ID of the RAM role
    // This parameter is provided by an external party and is used to prevent the confused deputy problem.
    credentialConfig.setExternalId("<ExternalId>");
    credentialConfig.setRoleSessionExpiration(3600);
    Client credentialClient = new Client(credentialConfig);
  }
}

接口調(diào)用方法

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用RamRoleArn初始化Credentials Client
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // 憑證類型
        credentialsConfig.setType("ram_role_arn");
        // 從環(huán)境變量中獲取AccessKey ID的值
        credentialsConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // 從環(huán)境變量中獲取AccessKey Secret的值
        credentialsConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_ARN設(shè)置RoleArn
        credentialsConfig.setRoleArn("<RoleArn>");
        // 角色會(huì)話名稱,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設(shè)置RoleSessionName
        credentialsConfig.setRoleSessionName("<RoleSessionName>");
        // 設(shè)置更小的權(quán)限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        credentialsConfig.setPolicy("<Policy>");
        // Not required, the external ID of the RAM role
        // This parameter is provided by an external party and is used to prevent the confused deputy problem.
        credentialsConfig.setExternalId("<ExternalId>");
        // 會(huì)話有效時(shí)間
        credentialsConfig.setRoleSessionExpiration(3600);
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // 使用Credentials初始化ECS Client。
        Config ecsConfig = new Config();
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        ecsConfig.setCredential(credentialClient);
        Client ecsClient = new Client(ecsConfig);
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方式五:使用ECS實(shí)例RAM角色

ECS和ECI實(shí)例均支持綁定實(shí)例RAM角色,當(dāng)在實(shí)例中使用Credentials工具時(shí),將自動(dòng)獲取實(shí)例綁定的RAM角色,并通過(guò)訪問(wèn)元數(shù)據(jù)服務(wù)獲取RAM角色的STS Token,以完成憑據(jù)客戶端的初始化。

實(shí)例元數(shù)據(jù)服務(wù)器支持加固模式和普通模式兩種訪問(wèn)方式,Credentials工具默認(rèn)使用加固模式(IMDSv2)獲取訪問(wèn)憑據(jù)。若使用加固模式時(shí)發(fā)生異常,您可以通過(guò)設(shè)置DisableIMDSv1來(lái)執(zhí)行不同的異常處理邏輯:

  1. 當(dāng)值為false(默認(rèn)值)時(shí),會(huì)使用普通模式繼續(xù)獲取訪問(wèn)憑據(jù)。

  2. 當(dāng)值為true時(shí),表示只能使用加固模式獲取訪問(wèn)憑據(jù),會(huì)拋出異常。

服務(wù)端是否支持IMDSv2,取決于您在服務(wù)器的配置。

說(shuō)明
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("ecs_ram_role");
        // 選填,該ECS角色的角色名稱,不填會(huì)自動(dòng)獲取,但是建議加上以減少請(qǐng)求次數(shù),可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ECS_METADATA設(shè)置RoleName
        credentialConfig.setRoleName("<RoleName>");
        // true表示強(qiáng)制使用加固模式。默認(rèn)值:false,系統(tǒng)將首先嘗試在加固模式下獲取憑據(jù)。如果失敗,則會(huì)切換到普通模式進(jìn)行嘗試(IMDSv1)。
        // credentialConfig.setDisableIMDSv1(true);
        Client credentialClient = new Client(credentialConfig);
    }
}

接口調(diào)用方法

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用 EcsRamRole 初始化Credentials Client。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // 憑證類型。
        credentialsConfig.setType("ecs_ram_role");
        // 選填,該ECS角色的角色名稱,不填會(huì)自動(dòng)獲取,但是建議加上以減少請(qǐng)求次數(shù),可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ECS_METADATA設(shè)置RoleName
        credentialsConfig.setRoleName("<RoleName>");

        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        Config ecsConfig = new Config();
        // 配置云產(chǎn)品服務(wù)接入地址(endpoint)。
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        // 使用Credentials配置憑證。
        ecsConfig.setCredential(credentialClient);
        // 初始化ECS Client。
        Client ecsClient = new Client(ecsConfig);
        // 初始化DescribeRegions請(qǐng)求。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方式六:使用OIDCRoleArn

容器服務(wù) Kubernetes 版中設(shè)置了Worker節(jié)點(diǎn)RAM角色后,對(duì)應(yīng)節(jié)點(diǎn)內(nèi)的Pod中的應(yīng)用也就可以像ECS上部署的應(yīng)用一樣,通過(guò)元數(shù)據(jù)服務(wù)(Meta Data Server)獲取關(guān)聯(lián)角色的STS Token。但如果容器集群上部署的是不可信的應(yīng)用(比如部署您的客戶提交的應(yīng)用,代碼也沒(méi)有對(duì)您開(kāi)放),您可能并不希望它們能通過(guò)元數(shù)據(jù)服務(wù)獲取Worker節(jié)點(diǎn)關(guān)聯(lián)實(shí)例RAM角色的STS Token。為了避免影響云上資源的安全,同時(shí)又能讓這些不可信的應(yīng)用安全地獲取所需的 STS Token,實(shí)現(xiàn)應(yīng)用級(jí)別的權(quán)限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。阿里云容器集群會(huì)為不同的應(yīng)用Pod創(chuàng)建和掛載相應(yīng)的服務(wù)賬戶OIDC Token文件,并將相關(guān)配置信息注入到環(huán)境變量中,Credentials工具通過(guò)獲取環(huán)境變量的配置信息,調(diào)用STS服務(wù)的AssumeRoleWithOIDC - OIDC角色SSO時(shí)獲取扮演角色的臨時(shí)身份憑證接口換取綁定角色的STS Token。詳情請(qǐng)參見(jiàn)通過(guò)RRSA配置ServiceAccount的RAM權(quán)限實(shí)現(xiàn)Pod權(quán)限隔離。

注入的環(huán)境變量如下:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {

  public static void main(String[] args) throws Exception {
    Config credentialConfig = new Config();
    credentialConfig.setType("oidc_role_arn");
    // RAM角色名稱ARN,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_ARN設(shè)置RoleArn
    credentialConfig.setRoleArn("<RoleArn>");
    // OIDC提供商ARN,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設(shè)置OidcProviderArn
    credentialConfig.setOidcProviderArn("<OidcProviderArn>");
    // OIDC Token文件路徑,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設(shè)置OidcTokenFilePath
    credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
    // 角色會(huì)話名稱,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設(shè)置RoleSessionName
    credentialConfig.setRoleSessionName("<RoleSessionName>");
    // 設(shè)置更小的權(quán)限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    credentialConfig.setPolicy("<Policy>");
    // 設(shè)置session過(guò)期時(shí)間
    credentialConfig.setRoleSessionExpiration(3600);
    Client credentialClient = new Client(credentialConfig);
  }
}

接口調(diào)用方法

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用OIDCRoleArn初始化Credentials Client。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // 憑證類型。
        credentialsConfig.setType("oidc_role_arn");
        // 角色ARN,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_ARN設(shè)置RoleArn
        credentialConfig.setRoleArn("<RoleArn>");
        // OIDC提供商ARN,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設(shè)置OidcProviderArn
        credentialConfig.setOidcProviderArn("<OidcProviderArn>");
        // OIDC Token文件路徑,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設(shè)置OidcTokenFilePath
        credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
        // 角色會(huì)話名稱,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設(shè)置RoleSessionName
        credentialConfig.setRoleSessionName("<RoleSessionName>");
        // 設(shè)置更小的權(quán)限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        credentialsConfig.setPolicy("<Policy>");
        // 設(shè)置session過(guò)期時(shí)間
        credentialsConfig.setRoleSessionExpiration(3600);
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        Config ecsConfig = new Config();
        // 配置云產(chǎn)品服務(wù)接入地址(endpoint)。
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        // 使用Credentials配置憑證。
        ecsConfig.setCredential(credentialClient);
        // 初始化ECS Client。
        Client ecsClient = new Client(ecsConfig);
        // 初始化DescribeRegions請(qǐng)求。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方式七:使用URI憑據(jù)

該方案底層實(shí)現(xiàn)是STS Token。Credentials工具通過(guò)您提供的URI獲取STS Token,完成憑據(jù)客戶端初始化。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("credentials_uri");
        // 憑證的 URI,格式為http://local_or_remote_uri/,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_CREDENTIALS_URI設(shè)置CredentialsUri
        credentialConfig.setCredentialsUri("<CredentialsUri>");
        Client credentialClient = new Client(credentialConfig);
    }
}

接口調(diào)用方法

指定Credentials提供地址,實(shí)現(xiàn)通過(guò)本地或遠(yuǎn)程的URI來(lái)獲取并自動(dòng)更新Token,完成云產(chǎn)品接口的調(diào)用。

調(diào)用單個(gè)云產(chǎn)品的接口需要云產(chǎn)品依賴。本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用URI憑據(jù)初始化Credentials Client。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // 憑證類型。
        credentialsConfig.setType("credentials_uri");
        // 從環(huán)境變量獲取Credentials URI,格式為http://local_or_remote_uri/,可以通過(guò)環(huán)境變量ALIBABA_CLOUD_CREDENTIALS_URI設(shè)置CredentialsUri
        credentialsConfig.setCredentialsUri("<CredentialsUri>");
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        Config ecsConfig = new Config();
        // 配置云產(chǎn)品服務(wù)接入地址(endpoint)。
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        // 使用Credentials配置憑證。
        ecsConfig.setCredential(credentialClient);
        // 初始化ECS Client。
        Client ecsClient = new Client(ecsConfig);
        // 初始化DescribeRegions請(qǐng)求。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方式八:使用Bearer Token

目前只有云呼叫中心CCC這款產(chǎn)品支持Bearer Token的憑據(jù)初始化方式。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("bearer");
        // 填入您的Bearer Token
        credentialConfig.setBearerToken("<BearerToken>");
        Client credentialClient = new Client(credentialConfig);
    }
}

接口調(diào)用方法

本示例以調(diào)用呼叫中心CCC的GetInstance接口為例,因此需先安裝CCC SDK。

import com.aliyun.ccc20200701.Client;
import com.aliyun.ccc20200701.models.GetInstanceRequest;
import com.aliyun.ccc20200701.models.GetInstanceResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用Bearer Token初始化Credentials Client。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // 憑證類型。
        credentialsConfig.setType("bearer");
        // 服務(wù)器端自動(dòng)生成的Bearer Token,帶有效期。
        credentialsConfig.setBearerToken("<bearer_token>");
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        Config cccConfig = new Config();
        // 配置云產(chǎn)品服務(wù)接入地址(endpoint)。
        cccConfig.setEndpoint("ccc.aliyuncs.com");
        // 使用Credentials配置憑證。
        cccConfig.setCredential(credentialClient);
        Client cccClient = new Client(cccConfig);
        GetInstanceRequest getInstanceRequest = new GetInstanceRequest().setInstanceId("ccc-test");
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        GetInstanceResponse response = cccClient.getInstanceWithOptions(getInstanceRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

默認(rèn)憑據(jù)鏈

當(dāng)您的程序開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境采用不同的憑據(jù)類型,常見(jiàn)做法是在代碼中獲取當(dāng)前環(huán)境信息,編寫獲取不同憑據(jù)的分支代碼。借助Credentials工具的默認(rèn)憑據(jù)鏈,您可以用同一套代碼,通過(guò)程序之外的配置來(lái)控制不同環(huán)境下的憑據(jù)獲取方式。當(dāng)您在不傳入?yún)?shù)的情況下,直接使用Client client = new Client()初始化憑據(jù)客戶端時(shí),阿里云SDK將會(huì)嘗試按照如下順序查找相關(guān)憑據(jù)信息。

1. 使用系統(tǒng)屬性

Credentials工具會(huì)優(yōu)先在系統(tǒng)屬性中獲取憑據(jù)信息。

當(dāng)系統(tǒng)屬性alibabacloud.accessKeyId密鑰key)、alibabacloud.accessKeyIdSecret(密鑰value均已設(shè)置且不為空時(shí),Credentials工具會(huì)優(yōu)先使用它們作為默認(rèn)憑據(jù)。

您可在運(yùn)行Java程序時(shí),添加屬性-Dalibabacloud.accessKeyId=*** -Dalibabacloud.accessKeyIdSecret=***來(lái)指定。

2. 使用環(huán)境變量

若不存在優(yōu)先級(jí)更高的憑據(jù)信息,Credentials工具會(huì)優(yōu)先在環(huán)境變量中獲取憑據(jù)信息。

  • 如果系統(tǒng)環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key) ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value) 不為空,Credentials工具會(huì)優(yōu)先使用它們作為默認(rèn)憑據(jù)。

  • 如果系統(tǒng)環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key)、ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value)、ALIBABA_CLOUD_SECURITY_TOKEN(Token)均不為空,Credentials工具會(huì)優(yōu)先使用STS Token作為默認(rèn)憑據(jù)。

3. 使用OIDC RAM角色

若不存在優(yōu)先級(jí)更高的憑據(jù)信息,Credentials工具會(huì)在環(huán)境變量中獲取如下內(nèi)容:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;

若以上三個(gè)環(huán)境變量都已設(shè)置內(nèi)容,Credentials將會(huì)使用變量?jī)?nèi)容調(diào)用STS服務(wù)的AssumeRoleWithOIDC - OIDC角色SSO時(shí)獲取扮演角色的臨時(shí)身份憑證接口換取STS Token作為默認(rèn)憑據(jù)。

4. 使用config.json配置文件

若不存在優(yōu)先級(jí)更高的憑據(jù)信息,Credentials工具會(huì)優(yōu)先在如下位置查找config.json文件是否存在:

Linux系統(tǒng):~/.aliyun/config.json

Windows系統(tǒng): C:\Users\USER_NAME\.aliyun\config.json

如果文件存在,程序?qū)?huì)使用配置文件中current 指定的憑據(jù)信息初始化憑據(jù)客戶端。當(dāng)然,您也可以通過(guò)環(huán)境變量 ALIBABA_CLOUD_PROFILE 來(lái)指定憑據(jù)信息,例如設(shè)置 ALIBABA_CLOUD_PROFILE 的值為client1。

config.json配置文件中每個(gè)mode的值代表了不同的憑據(jù)信息獲取方式:

  • AK:使用用戶的Access Key作為憑據(jù)信息;

  • RamRoleArn:使用RAM角色的ARN來(lái)獲取憑據(jù)信息;

  • EcsRamRole:利用ECS綁定的RAM角色來(lái)獲取憑據(jù)信息;

  • OIDC:通過(guò)OIDC ARN和OIDC Token來(lái)獲取憑據(jù)信息;

  • ChainableRamRoleArn:采用角色鏈的方式,通過(guò)指定JSON文件中的其他憑據(jù),以重新獲取新的憑據(jù)信息。

配置示例信息如下:

{
	"current": "default",
	"profiles": [
		{
			"name": "default",
			"mode": "AK",
			"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
			"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
		},
		{
			"name":"client1",
			"mode":"RamRoleArn",
			"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
			"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		},
		{
			"name":"client2",
			"mode":"EcsRamRole",
			"ram_role_name":"<RAM_ROLE_ARN>"
		},
		{
			"name":"client3",
			"mode":"OIDC",
			"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
			"oidc_token_file":"<OIDC_TOKEN_FILE>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		},
		{
			"name":"client4",
			"mode":"ChainableRamRoleArn",
			"source_profile":"<PROFILE_NAME>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		}
	]
}

5. 使用ECS實(shí)例RAM角色

若不存在優(yōu)先級(jí)更高的憑據(jù)信息,Credentials工具將通過(guò)環(huán)境變量獲取ALIBABA_CLOUD_ECS_METADATA(ECS實(shí)例RAM角色名稱)的值。若該變量的值存在,程序?qū)⒉捎眉庸棠J剑↖MDSv2)訪問(wèn)ECS的元數(shù)據(jù)服務(wù)(Meta Data Server),以獲取ECS實(shí)例RAM角色的STS Token作為默認(rèn)憑據(jù)信息。在使用加固模式時(shí)若發(fā)生異常,將使用普通模式兜底來(lái)獲取訪問(wèn)憑據(jù)。您也可以通過(guò)設(shè)置環(huán)境變量ALIBABA_CLOUD_IMDSV1_DISABLED,執(zhí)行不同的異常處理邏輯:

  1. 當(dāng)值為false時(shí),會(huì)使用普通模式繼續(xù)獲取訪問(wèn)憑據(jù)。

  2. 當(dāng)值為true時(shí),表示只能使用加固模式獲取訪問(wèn)憑據(jù),會(huì)拋出異常。

服務(wù)端是否支持IMDSv2,取決于您在服務(wù)器的配置。

6. 使用CredentialsURI

若不存在優(yōu)先級(jí)更高的憑據(jù)信息,Credentials工具會(huì)在環(huán)境變量中獲取ALIBABA_CLOUD_CREDENTIALS_URI,若存在,程序?qū)⒄?qǐng)求該URI地址,獲取臨時(shí)安全憑證作為默認(rèn)憑據(jù)信息。

如何切換憑據(jù)

當(dāng)您想要在程序中使用不同的訪問(wèn)憑據(jù)調(diào)用不同OpenAPI時(shí),可以通過(guò)如下方式。

使用多個(gè)憑據(jù)客戶端

通過(guò)初始化多個(gè)憑據(jù)客戶端,傳入到不同的接口請(qǐng)求客戶端。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) {
        Config credentialConfig1 = new Config();
        credentialConfig1.setType("access_key");
        credentialConfig1.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        credentialConfig1.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        Client credentialClient1 = new Client(credentialConfig1);

        Config credentialConfig2 = new Config();
        credentialConfig2.setType("sts");
        credentialConfig2.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        credentialConfig2.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        credentialConfig2.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        Client credentialClient2 = new Client(credentialConfig2);
    }
}

使用AuthUtils

當(dāng)我們初始化憑據(jù)客戶端采用配置文件記錄憑據(jù)信息時(shí),可以使用AuthUtils.setClientType切換到不同的憑據(jù)配置上。示例代碼如下。

import com.aliyun.credentials.utils.AuthUtils;

public class Sample {
    public static void main(String[] args) {
        // 若不配置AuthUtils類clientType屬性,則默認(rèn)使用default。
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
        // 切換到client1憑據(jù)上
        AuthUtils.setClientType("client1");
        com.aliyun.credentials.Client credentialClient1 = new com.aliyun.credentials.Client();
        // 切換到client2憑據(jù)上
        AuthUtils.setClientType("client2");
        com.aliyun.credentials.Client credentialClient2 = new com.aliyun.credentials.Client();
    }
}

接口調(diào)用方法

本示例以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。

import com.aliyun.credentials.utils.AuthUtils;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // 使用默認(rèn)憑證初始化Credentials Client。
        com.aliyun.credentials.Client defaultCredentialClient = new com.aliyun.credentials.Client();
        // 使用配置文件中client1初始化Credentials Client。
        AuthUtils.setClientType("client1");
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        Config ecsConfig = new Config();
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        // 使用默認(rèn)憑證配置憑證。
        ecsConfig.setCredential(defaultCredentialClient);
        // 初始化ECS Client。
        Client ecsClient = new Client(ecsConfig);
        // 初始化DescribeRegions請(qǐng)求。
        DescribeRegionsRequest describeRegionsRequest = new DescribeRegionsRequest();
        // 初始化運(yùn)行時(shí)配置。
        RuntimeOptions runtime = new RuntimeOptions();
        // 調(diào)用DescribeRegions接口并獲得響應(yīng)。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeRegionsRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

相關(guān)文檔