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

管理訪問憑證

更新時間:
重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。

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

背景信息

憑據是指用戶證明其身份的一組信息。用戶在系統中進行登錄時,需要提供正確的憑據才能驗證身份。常見的憑據類型有:

  1. 阿里云主賬號和RAM用戶的永久憑據 AccessKey(簡稱AK)是由AccessKey ID和AccessKey Secret組成的密鑰對。

  2. 阿里云RAM角色的STS臨時訪問Token,簡稱STS Token。它是可以自定義時效和訪問權限的臨時身份憑據,詳情請參見什么是STS

  3. Bearer Token。它是一種身份驗證和授權的令牌類型。

前提條件

安裝Credentials工具

  • 使用go get下載安裝。

$ go get -u github.com/aliyun/credentials-go
  • 如果您使用dep來管理的依賴包,您可以使用以下命令。

$ dep ensure -add github.com/aliyun/credentials-go

使用最新發布Credentials依賴包,確保所有憑證支持。

初始化憑據客戶端

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

重要

在項目中使用明文AccessKey,容易因代碼倉庫權限管理不當造成AccessKey泄露,會威脅該賬號下所有資源的安全。建議通過環境變量、配置文件等方式獲取AccessKey。

方式一:使用默認憑據鏈

當您在初始化憑據客戶端不傳入任何參數時,Credentials會使用默認憑據鏈方式初始化客戶端。默認憑據的讀取邏輯請參見默認憑據鏈

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// 不指定參數
	config := new(credentials.Config)
	credential, err := credentials.NewCredential(config)
}

接口調用方法

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// 使用默認憑證初始化Credentials Client。
	credentialClient, _err := credentials.NewCredential(nil)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = credentialClient
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式二:使用AK

阿里云賬號、RAM用戶可生成調用OpenAPI的密鑰對AK。如何獲取AK請參見文檔創建AccessKey。您可使用AK初始化憑據客戶端。

警告

阿里云主賬號擁有資源的全部權限,AK一旦泄露,會給系統帶來巨大風險,不建議使用。

推薦使用最小化授權的RAM用戶的AK。

import (
	"fmt"
	"os"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("access_key").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))

	akCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	accessKeyId, err := akCredential.GetAccessKeyId()
	accessSecret, err := akCredential.GetAccessKeySecret()
	credentialType := akCredential.GetType()
	fmt.Println(accessKeyId, accessSecret, credentialType)
}

接口調用方法

通過Credentials工具讀取AK,完成云產品OpenAPI接口的調用。

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	// 使用AK 初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("access_key").
		// 設置為AccessKey ID值。
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// 設置為AccessKey Secret值。
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = credentialClient
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式三:使用STS Token

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

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("sts").
		// 從環境變量中獲取AccessKey Id。
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// 從環境變量中獲取AccessKey Secret
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// 從環境變量中獲取STS臨時憑證。
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))

	stsCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	credential, err := stsCredential.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}

接口調用方法

通過Credentials工具讀取臨時安全令牌(STS Token),完成云產品OpenAPI接口的調用。

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDKSTS SDK

package main

import (
	"os"

	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// 創建STS client,調用AssumeRole獲取STS TOKEN
	stsConfig := &openapi.Config{}
	stsConfig.SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
	stsConfig.SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	stsConfig.SetEndpoint("sts.cn-hangzhou.aliyuncs.com")
	client, _err := sts20150401.NewClient(stsConfig)
	if _err != nil {
		panic(_err)
	}
	assumeRoleRequest := &sts20150401.AssumeRoleRequest{}
	// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn
	assumeRoleRequest.SetRoleArn("<RoleArn>")
	// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName
	assumeRoleRequest.SetRoleSessionName("<RoleSessionName>")
	assumeRoleRequest.SetDurationSeconds(3600)
	result, _err := client.AssumeRole(assumeRoleRequest)
	if _err != nil {
		panic(_err)
	}
	assumeRoleResponseBodyCredentials := result.Body.Credentials

	// 使用STS Token初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("sts").
		SetAccessKeyId(*assumeRoleResponseBodyCredentials.AccessKeyId).
		SetAccessKeySecret(*assumeRoleResponseBodyCredentials.AccessKeySecret).
		SetSecurityToken(*assumeRoleResponseBodyCredentials.SecurityToken)

	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-hangzhou.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = credentialClient
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式四:使用AK及RamRoleArn

該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具可以幫助開發者前往STS換取STS Token。您也可以通過為SetPolicy賦值來限制RAM角色到一個更小的權限集合。

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("ram_role_arn").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn
		SetRoleArn("<RoleArn>").
		// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName
		SetRoleSessionName("<RoleSessionName>").
		// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// 非必填,設置session過期時間。
		SetRoleSessionExpiration(3600).
		// 非必填,角色外部 ID,該參數為外部提供的用于表示角色的參數信息,主要功能是防止混淆代理人問題。
		SetExternalId("ExternalId").
		// 非必填,默認為sts.aliyuncs.com,建議使用Region化的STS域名,選擇地理位置更接近的Region可以保證網絡連通性.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")

	arnCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}

	credential, err := arnCredential.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
說明

ExternalId的更多介紹,請參見使用ExternalId防止混淆代理人問題

接口調用方法

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	// 使用RamRoleArn初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("ram_role_arn").
		// 設置為AccessKey ID值。
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// 設置為AccessKey Secret值。
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn
		SetRoleArn("<RoleArn>").
		// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName
		SetRoleSessionName("<RoleSessionName>").
		// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// 設置session過期時間,非必填。
		SetRoleSessionExpiration(3600).
		// 非必填,默認為sts.aliyuncs.com,建議使用Region化的STS域名,選擇地理位置更接近的Region可以保證網絡連通性.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = credentialClient
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式五:使用ECS實例RAM角色

ECS和ECI實例均支持綁定實例RAM角色,當在實例中使用Credentials工具時,將自動獲取實例綁定的RAM角色,并通過訪問元數據服務獲取RAM角色的STS Token,以完成憑據客戶端的初始化。

實例元數據服務器支持加固模式和普通模式兩種訪問方式,Credentials工具默認使用加固模式(IMDSv2)獲取訪問憑據。若使用加固模式時發生異常,您可以通過設置DisableIMDSv1來執行不同的異常處理邏輯:

  1. 當值為false(默認值)時,會使用普通模式繼續獲取訪問憑據。

  2. 當值為true時,表示只能使用加固模式獲取訪問憑據,會拋出異常。

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

說明
package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
)

func _main(args []*string) {
	// 使用EcsRamRole初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("ecs_ram_role").
		// 選填,該ECS角色的角色名稱,不填會自動獲取,但是建議加上以減少請求次數,可以通過環境變量ALIBABA_CLOUD_ECS_METADATA設置RoleName
		SetRoleName("<RoleName>")
		// true表示強制使用加固模式。默認值:false,系統將首先嘗試在加固模式下獲取憑據。如果失敗,則會切換到普通模式進行嘗試(IMDSv1)。
	// credentialsConfig.SetDisableIMDSv1(true)
	credentialClient, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	credential, err := credentialClient.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}

接口調用方法

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)

func _main(args []*string) {
	// 使用EcsRamRole初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("ecs_ram_role").
		// 選填,該ECS角色的角色名稱,不填會自動獲取,但是建議加上以減少請求次數,可以通過環境變量ALIBABA_CLOUD_ECS_METADATA設置RoleName
		SetRoleName("<RoleName>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = credentialClient
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式六:使用OIDCRoleArn

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

注入的環境變量如下:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("oidc_role_arn").
		// OIDC提供商ARN,可以通過環境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設置OidcProviderArn
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// OIDC Token文件路徑,可以通過環境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設置OidcTokenFilePath
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// RAM角色名稱ARN,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// 非必填,設置session過期時間
		SetRoleSessionExpiration(3600).
		// 非必填,默認為sts.aliyuncs.com,建議使用Region化的STS域名,選擇地理位置更接近的Region可以保證網絡連通性
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	oidcCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	credential, err := oidcCredential.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}

接口調用方法

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
	"os"
)

func _main(args []*string) {
	// 使用OIDCRoleArn初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("oidc_role_arn").
		// OIDC提供商ARN,可以通過環境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設置OidcProviderArn
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// OIDC Token文件路徑,可以通過環境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設置OidcTokenFilePath
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// RAM角色名稱ARN,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// 設置session過期時間
		SetRoleSessionExpiration(3600)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = credentialClient
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式七:使用URI憑據

該方案底層實現是STS Token。Credentials工具通過您提供的URI獲取STS Token,完成憑據客戶端初始化。

package main

import (
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
                // 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變量ALIBABA_CLOUD_CREDENTIALS_URI設置CredentialsUri
		SetCredentialsUri("<CredentialsUri>")

	uriCredential, err := credentials.NewCredential(config)
}

接口調用方法

指定Credentials提供地址,實現通過本地或遠程的URI來獲取并自動更新Token,完成云產品接口的調用。

本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
		// 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變量ALIBABA_CLOUD_CREDENTIALS_URI設置CredentialsUri
		SetCredentialsUri("<CredentialsUri>")

	uriCredential, _err := credentials.NewCredential(config)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// 配置云產品服務接入地址(endpoint)。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// 使用Credentials配置憑證。
	ecsConfig.Credential = uriCredential
	// 初始化ECS Client。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// 初始化DescribeRegions請求。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// 初始化運行時配置。
	runtime := &util.RuntimeOptions{}
	// 調用DescribeRegions接口并獲得響應。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方式八:使用Bearer Token

目前只有云呼叫中心CCC這款產品支持Bearer Token的憑據初始化方式。

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("bearer").
		// 填入您的Bearer Token
		SetBearerToken("<BearerToken>")
	bearerCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	bearerToken := bearerCredential.GetBearerToken()
	credentialType := bearerCredential.GetType()
	fmt.Println(bearerToken, credentialType)
}

接口調用方法

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

package main

import (
	ccc20200701 "github.com/alibabacloud-go/ccc-20200701/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)

func _main() (_err error) {
	// 使用Bearer Token初始化Credentials Client。
	credentialsConfig := new(credentials.Config).
		// 憑證類型。
		SetType("bearer").
		SetBearerToken("<BearerToken>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		return _err
	}

	// 使用Credentials Client初始化CCC Client。
	config := &openapi.Config{}
	config.Endpoint = tea.String("ccc.cn-shanghai.aliyuncs.com") // 配置云產品服務接入地址(endpoint)。
	config.Credential = credentialClient                         // 使用Credentials配置憑證。
	cccClient, _err := ccc20200701.NewClient(config)
	if _err != nil {
		return _err
	}
	getInstanceRequest := &ccc20200701.GetInstanceRequest{
		InstanceId: tea.String("ccc-test"),
	}
	runtime := &util.RuntimeOptions{}
	response, _err := cccClient.GetInstanceWithOptions(getInstanceRequest, runtime)
	if _err != nil {
		return _err
	}
	panic(response.Body.String())
}

func main() {
	err := _main()
	if err != nil {
		panic(err)
	}
}

默認憑據鏈

當開發環境與生產環境使用的憑據類型不一致時,常見做法是在代碼中獲取當前環境信息,編寫獲取不同憑據的分支代碼。借助Credentials工具的默認憑據鏈,您可以用同一套代碼,通過程序之外的配置來控制不同環境下的憑據獲取方式。當您使用NewCredential()初始化憑據客戶端,且不傳入任何參數時,阿里云SDK將會嘗試按照如下順序查找相關憑據信息。

1. 使用環境變量

若不存在優先級更高的憑據信息,Credentials工具會優先在環境變量中獲取憑據信息。

  • 如果系統環境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key) ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value) 不為空,Credentials工具會優先使用它們作為默認憑據。

  • 如果系統環境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key)、ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value)、ALIBABA_CLOUD_SECURITY_TOKEN(Token)均不為空,Credentials工具會優先使用STS Token作為默認憑據。

2. 使用OIDC RAM角色

若不存在優先級更高的憑據信息,Credentials工具會在環境變量中獲取如下內容:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;

若以上三個環境變量都已設置內容,Credentials將會使用變量內容調用STS服務的AssumeRoleWithOIDC - OIDC角色SSO時獲取扮演角色的臨時身份憑證接口換取STS Token作為默認憑據。

3. 使用config.json配置文件

若不存在優先級更高的憑據信息,Credentials工具會優先在如下位置查找config.json文件是否存在:

Linux系統:~/.aliyun/config.json

Windows系統: C:\Users\USER_NAME\.aliyun\config.json

如果文件存在,程序將會使用配置文件中current 指定的憑據信息初始化憑據客戶端。當然,您也可以通過環境變量 ALIBABA_CLOUD_PROFILE 來指定憑據信息,例如設置 ALIBABA_CLOUD_PROFILE 的值為client1

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

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

  • RamRoleArn:使用RAM角色的ARN來獲取憑據信息;

  • EcsRamRole:利用ECS綁定的RAM角色來獲取憑據信息;

  • OIDC:通過OIDC ARN和OIDC Token來獲取憑據信息;

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

配置示例信息如下:

{
	"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
		}
	]
}

4. 使用ECS實例RAM角色

若不存在優先級更高的憑據信息,Credentials工具將通過環境變量獲取ALIBABA_CLOUD_ECS_METADATA(ECS實例RAM角色名稱)的值。若該變量的值存在,程序將采用加固模式(IMDSv2)訪問ECS的元數據服務(Meta Data Server),以獲取ECS實例RAM角色的STS Token作為默認憑據信息。在使用加固模式時若發生異常,將使用普通模式兜底來獲取訪問憑據。您也可以通過設置環境變量ALIBABA_CLOUD_IMDSV1_DISABLED,執行不同的異常處理邏輯:

  1. 當值為false時,會使用普通模式繼續獲取訪問憑據。

  2. 當值為true時,表示只能使用加固模式獲取訪問憑據,會拋出異常。

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

5. 使用Credentials工具URI

若不存在優先級更高的憑據信息,Credentials工具會在環境變量中獲取ALIBABA_CLOUD_CREDENTIALS_URI,若存在,程序將請求該URI地址,獲取臨時安全憑證作為默認憑據信息。

如何切換憑據

當您想要在程序中使用不同的訪問憑據調用不同OpenAPI時,可以通過如下方式。

使用多個憑據客戶端

通過初始化多個憑據客戶端,傳入到不同的接口請求客戶端。

package main

import (
	credentials "github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config1 := new(credentials.Config).
		SetType("access_key").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	akCredential, err1 := credentials.NewCredential(config1)

	config2 := new(credentials.Config).
		SetType("sts").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))

	akCredential, err2 := credentials.NewCredential(config2)
}

相關文檔