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

Go配置訪問憑證

重要

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

使用Go SDK發起OSS請求,您需要配置訪問憑證。阿里云服務會通過訪問憑證驗證您的身份信息和訪問權限。您可以根據使用場景對認證和授權的要求,選擇不同類型的訪問憑證。本文介紹如何配置臨時訪問憑證和長期訪問憑證。

前提條件

在配置訪問憑證前,您需要安裝Go SDK。詳情請參見安裝

初始化憑證提供者

憑證提供者選型

OSS支持多種方式初始化憑證提供者,您可以根據使用場景對認證和授權的要求,選擇對應的方式初始化憑證提供者。

憑證提供者初始化方式

適用場景

是否需要提供前置的AKSTS Token

底層實現基于的憑證

憑證有效期

憑證輪轉或刷新方式

方式一:使用AK

部署運行在安全、穩定且不易受外部攻擊的環境的應用程序,無需頻繁輪轉憑證就可以長期訪問云服務

AK

長期

手動輪轉

方式二:使用STS Token

部署運行在不可信的環境的應用程序,希望能控制訪問的有效期、權限

STS Token

臨時

手動刷新

方式三:使用RAMRoleARN

需要授權訪問云服務,例如跨阿里云賬號訪問云服務的應用程序

STS Token

臨時

自動刷新

方式四:使用ECSRAMRole

部署運行在阿里云的ECS實例、ECI實例、容器服務Kubernetes版的Worker節點中的應用程序

STS Token

臨時

自動刷新

方式五:使用OIDCRoleARN

部署運行在阿里云的容器服務Kubernetes版的Worker節點中的不可信應用程序

STS Token

臨時

自動刷新

方式六:使用函數計算上下文中的Credentials

部署運行在阿里云函數計算中的應用程序的函數

STS Token

臨時

無需刷新

方式七:使用CredentialsURI

需要通過外部系統獲取訪問憑證的應用程序

STS Token

臨時

自動刷新

方式八:使用自動輪轉的AK

部署運行在面臨AK泄露風險的環境的應用程序,需要頻繁輪轉憑證才長期能訪問云服務

AK

長期

自動輪轉

方式九:自定義訪問憑證

如果以上憑證配置方式都不滿足要求時,您可以自定義獲取憑證的方式

自定義

自定義

自定義

自定義

方式一:使用AK

如果您的應用程序部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的OSS,且不能頻繁輪轉憑證時,您可以使用阿里云主賬號或RAM用戶的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護復雜度增加的風險。如何獲取AK,請參見CreateAccessKey - 創建主賬號或RAM用戶訪問密鑰

環境變量

警告

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

  1. 使用AK設置環境變量。

    Mac OS X/Linux/Unix

    export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>

    Windows

    set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. 使用環境變量來傳遞憑證信息。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 創建OSSClient實例。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }
    

靜態憑證

您可以在代碼中使用變量來引用憑證,這些變量在運行時會被環境變量、配置文件或其他外部數據源中的實際憑證值填充。

以下操作步驟以配置文件為例。

說明

需要安裝go-ini庫。如果尚未安裝,您可以使用以下命令安裝:

go get -u github.com/go-ini/ini
  1. 創建配置文件config.ini

    [credentials]
    alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID>
    alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. 使用配置文件來傳遞憑證信息。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"gopkg.in/ini.v1"
    )
    
    type defaultCredentials struct {
    	config *oss.Config
    }
    
    func (defCre *defaultCredentials) GetAccessKeyID() string {
    	return defCre.config.AccessKeyID
    }
    
    func (defCre *defaultCredentials) GetAccessKeySecret() string {
    	return defCre.config.AccessKeySecret
    }
    
    func (defCre *defaultCredentials) GetSecurityToken() string {
    	return defCre.config.SecurityToken
    }
    
    type defaultCredentialsProvider struct {
    	config *oss.Config
    }
    
    func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    	return &defaultCredentials{config: defBuild.config}
    }
    func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) {
    	var provider defaultCredentialsProvider
    	if accessID == "" {
    		return provider, fmt.Errorf("access key id is empty!")
    	}
    	if accessKey == "" {
    		return provider, fmt.Errorf("access key secret is empty!")
    	}
    	config := &oss.Config{
    		AccessKeyID:     accessID,
    		AccessKeySecret: accessKey,
    		SecurityToken:   token,
    	}
    	return defaultCredentialsProvider{
    		config,
    	}, nil
    }
    
    func main() {
    	cfg, err := ini.Load("config.ini")
    	if err != nil {
    		fmt.Println("Error loading config file:", err)
    		return
    	}
    	accessKeyID := cfg.Section("credentials").Key("alibaba_cloud_access_key_id").String()
    	accessKeySecret := cfg.Section("credentials").Key("alibaba_cloud_access_key_secret").String()
    	provider, err := NewDefaultCredentialsProvider(accessKeyID, accessKeySecret, "")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }
    

方式二:使用STS Token

如果您的應用程序需要臨時訪問OSS,您可以使用通過STS服務獲取的臨時身份憑證(Access Key ID、Access Key SecretSecurity Token)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個STS Token,存在安全性風險和維護復雜度增加的風險。此外,如果您需要多次臨時訪問OSS,您需要手動刷新STS Token。如何獲取STS Token,請參見AssumeRole - 獲取扮演角色的臨時身份憑證

  1. 使用臨時身份憑證設置環境變量。

    Mac OS X/Linux/Unix

    export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>

    Windows

    set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
  2. 通過環境變量來傳遞憑證信息。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET,OSS_SESSION_TOKEN。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 創建OSSClient實例。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }
    

方式三:使用RAMRoleARN

如果您的應用程序需要授權訪問OSS,例如跨阿里云賬號訪問OSS,您可以使用RAMRoleARN初始化憑證提供者。該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具會前往STS服務獲取STS Token,并在會話到期前自動刷新STS Token。此外,您還可以通過為policy賦值來限制RAM角色到一個更小的權限集合。需要注意的是,該方式需要您提供一個AK,存在安全性風險和維護復雜度增加的風險。如何獲取AK,請參見CreateAccessKey - 為RAM用戶創建訪問密鑰。如何獲取RAMRoleARN,請參見CreateRole - 創建角色

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置訪問憑證。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type defaultCredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewRamRoleArnCredentialsProvider(credential credentials.Credential) defaultCredentialsProvider {
    	return defaultCredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// 填寫Credential類型,固定值為ram_role_arn。
    		SetType("ram_role_arn").
    		// 從環境變量中獲取RAM用戶的訪問密鑰(AccessKeyIdAccessKeySecret)。
    		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
    		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
    		// 以下操作默認直接填入參數數值,您也可以通過添加環境變量,并使用os.Getenv("<變量名稱>")的方式來set對應參數
    		// 從環境變量中獲取RAM角色的ARN信息,即需要扮演的角色ID。格式為acs:ram::$accountID:role/$roleName。
    		SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // RoleArn默認環境變量規范名稱ALIBABA_CLOUD_ROLE_ARN
    		// 自定義角色會話名稱,用于區分不同的令牌。
    		SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // RoleSessionName默認環境變量規范名稱ALIBABA_CLOUD_ROLE_SESSION_NAME
    		// (可選)限制STS Token權限。
    		SetPolicy("").
    		// (可選)限制STS Token的有效時間。
    		SetRoleSessionExpiration(3600)
    
    	arnCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	provider := NewRamRoleArnCredentialsProvider(arnCredential)
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	fmt.Printf("client:%#v\n", client)
    }
    

方式四:使用ECSRAMRole

如果您的應用程序運行在ECS實例、ECI實例、容器服務KubernetesWorker節點中,建議您使用ECSRAMRole初始化憑證提供者。該方式底層實現是STS Token。ECSRAMRole允許您將一個角色關聯到ECS實例、ECI實例或容器服務 Kubernetes 版Worker節點,實現在實例內部自動刷新STS Token。該方式無需您提供一個AKSTS Token,消除了手動維護AKSTS Token的風險。如何獲取ECSRAMRole,請參見CreateRole - 創建角色

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置ECSRAMRole作為訪問憑證。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type CredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewEcsCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    	return CredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// 指定Credential類型,固定值為ecs_ram_role。
    		SetType("ecs_ram_role").
    		// (可選項)指定角色名稱。如果不指定,OSS會自動獲取角色。強烈建議指定角色名稱,以降低請求次數。
    		SetRoleName("RoleName")
    
    	ecsCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		return
    	}
    	provider := NewEcsCredentialsProvider(ecsCredential)
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    
    }
    

方式五:使用OIDCRoleARN

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

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  1. 配置OIDCRAM角色作為訪問憑證。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type CredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewOIDCRoleARNCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    	return CredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// 指定 OIDC 令牌的文件路徑,用于存儲 OIDC 令牌。
    		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
    		// 以下操作默認直接填入參數數值,您也可以通過添加環境變量,并使用os.Getenv("<變量名稱>")的方式來set對應參數
    		// 指定Credential類型,固定值為oidc_role_arn。
    		SetType("oidc_role_arn").
    		// 指定 OIDC 提供者的 ARN(Amazon Resource Name),格式為 acs:ram::account-id:oidc-provider/provider-name。
    		SetOIDCProviderArn("acs:ram::113511544585****:oidc-provider/TestOidcProvider"). // OIDCProviderArn默認環境變量規范名稱ALIBABA_CLOUD_OIDC_PROVIDER_ARN
    		// 自定義角色會話名稱,用于區分不同的令牌。
    		SetRoleSessionName("role_session_name"). // RoleSessionName默認環境變量規范名稱ALIBABA_CLOUD_ROLE_SESSION_NAME
    		// 填寫角色的ARN信息,即需要扮演的角色ID。格式為acs:ram::113511544585****:oidc-provider/TestOidcProvider
    		SetRoleArn("acs:ram::113511544585****:role/testoidc"). // RoleArn默認環境變量規范名稱ALIBABA_CLOUD_ROLE_ARN
    		// (可選)指定訪問角色時要使用的策略。
    		SetPolicy("").
    		SetSessionExpiration(3600)
    	oidcCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		return
    	}
    	provider := NewOIDCRoleARNCredentialsProvider(oidcCredential)
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }
    

方式六:使用函數計算上下文中的Credentials

如果您的應用程序的函數部署運行在函數計算中,您可以使用函數計算上下文中的Credentials初始化憑證提供者。該方式底層實現是STS Token。函數計算根據函數配置的角色,通過扮演服務角色,而獲取一個STS Token,然后通過上下文中的參數CredentialsSTS Token傳遞給您的應用程序。該STS Token的有效期為36小時,且不支持修改。函數的最大執行時間為24小時,因此,執行函數過程中,STS Token不會過期,您無需考慮刷新問題。該方式無需您提供一個AKSTS Token,消除了手動維護AKSTS Token的風險。如何授予函數計算訪問OSS的權限,請參見授予函數計算訪問其他云服務的權限

  1. 添加函數計算上下文依賴。

    go get github.com/aliyun/fc-runtime-go-sdk/fc
    go get github.com/aliyun/fc-runtime-go-sdk/fccontext
  2. 使用函數計算上下文中的Credentials初始化憑證提供者。

    package main
    
    import (
    	"context"
    	"fmt"
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/fc-runtime-go-sdk/fc"
    	"github.com/aliyun/fc-runtime-go-sdk/fccontext"
    )
    
    type GetObjectContext struct {
    	OutputRoute string `json:"outputRoute"`
    	OutputToken string `json:"outputToken"`
    	InputOssUrl string `json:"inputOssUrl"`
    }
    
    type StructEvent struct {
    	GetObjectContext GetObjectContext `json:"getObjectContext"`
    }
    
    func HandleRequest(ctx context.Context, event StructEvent) error {
    	endpoint := event.GetObjectContext.OutputRoute
    	fctx, _ := fccontext.FromContext(ctx)
    	client, err := oss.New(endpoint, fctx.Credentials.AccessKeyId, fctx.Credentials.AccessKeySecret, oss.SecurityToken(fctx.Credentials.SecurityToken))
    	if err != nil {
    		return fmt.Errorf("client new error: %v", err)
    	}
    	fmt.Printf("client:%#v\n", client)
    	return nil
    }
    
    func main() {
    	fc.Start(HandleRequest)
    }
    

方式七:使用CredentialsURI

如果您的應用程序需要通過外部系統獲取阿里云憑證,從而實現靈活的憑證管理和無密鑰訪問,您可以使用CredentialsURI初始化憑證提供者。該方式底層實現是STS Token。Credentials工具通過您提供的URI獲取STS Token,完成憑證客戶端初始化。該方式無需您提供一個AKSTS Token,消除了手動維護AKSTS Token的風險。需要注意的是,提供CredentialsURI響應的后端服務需要實現STS Token的自動刷新邏輯,確保您的應用程序始終能獲取到有效憑證。

  1. 為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:

    • 響應狀態碼:200

    • 響應體結構:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  3. 配置CredentialsURI作為訪問憑證。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/credentials-go/credentials"
    )
    
    type Credentials struct {
    	AccessKeyId     string
    	AccessKeySecret string
    	SecurityToken   string
    }
    
    type CredentialsProvider struct {
    	cred credentials.Credential
    }
    
    func (credentials *Credentials) GetAccessKeyID() string {
    	return credentials.AccessKeyId
    }
    
    func (credentials *Credentials) GetAccessKeySecret() string {
    	return credentials.AccessKeySecret
    }
    
    func (credentials *Credentials) GetSecurityToken() string {
    	return credentials.SecurityToken
    }
    
    func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    	cred, _ := defBuild.cred.GetCredential()
    	return &Credentials{
    		AccessKeyId:     *cred.AccessKeyId,
    		AccessKeySecret: *cred.AccessKeySecret,
    		SecurityToken:   *cred.SecurityToken,
    	}
    }
    
    func NewCredentialsUriCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    	return CredentialsProvider{
    		cred: credential,
    	}
    }
    
    func main() {
    	config := new(credentials.Config).
    		// 指定Credential類型,固定值為credentials_uri。
    		SetType("credentials_uri").
    		// 指定 url 地址;您也可以通過設置環境變量,并使用"os.Getenv("<變量名稱>")的方式進行參數傳遞。
    		// URLCredential默認環境變量規范名稱ALIBABA_CLOUD_CREDENTIALS_URI
    		SetURLCredential("http://127.0.0.1")
    	uriCredential, err := credentials.NewCredential(config)
    	if err != nil {
    		return
    	}
    	provider := NewCredentialsUriCredentialsProvider(uriCredential)
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", client)
    }
    

方式八:使用自動輪轉的AK

如果您的應用程序需要長期訪問您的OSS,但部署運行的環境面臨AK泄露的風險,需要頻繁手動輪轉(輪換)AK,您可以使用ClientKey初始化憑證提供者。該方式底層實現是AK。使用ClientKey后,密鑰管理服務(KMS)可以對托管的RAM用戶AK進行全自動的定期輪轉,將靜態的RAM用戶AK動態化,從而降低AK泄漏的風險。除定期輪轉外,KMS還支持立即輪轉,在AK泄漏情況下快速更換AK。該方式無需您手動維護一個AK,從而降低安全性風險和維護復雜度增加的風險。如何獲取ClientKey,請參見創建應用接入點

  1. 使用go get命令,在項目中使用憑據客戶端。

    go get -u github.com/aliyun/aliyun-secretsmanager-client-go
  2. 創建配置文件secretsmanager.properties

    # 訪問憑據類型
    credentials_type=client_key
    
    # 讀取client key的解密密碼:支持從環境變量或者文件讀取
    client_key_password_from_env_variable=#your client key private key password environment variable name#
    client_key_password_from_file_path=#your client key private key password file path#
    
    # Client Key私鑰文件路徑
    client_key_private_key_path=#your client key private key file path#
    
    # 關聯的KMS服務地域
    cache_client_region_id=[{"regionId":"#regionId#"}]
  3. 構建客戶端。

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    	"github.com/aliyun/aliyun-secretsmanager-client-go/sdk"
    )
    
    type defaultCredentials struct {
    	config *oss.Config
    }
    
    func (defCre *defaultCredentials) GetAccessKeyID() string {
    	return defCre.config.AccessKeyID
    }
    
    func (defCre *defaultCredentials) GetAccessKeySecret() string {
    	return defCre.config.AccessKeySecret
    }
    
    func (defCre *defaultCredentials) GetSecurityToken() string {
    	return defCre.config.SecurityToken
    }
    
    type defaultCredentialsProvider struct {
    	config *oss.Config
    }
    
    func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    	return &defaultCredentials{config: defBuild.config}
    }
    func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) {
    	var provider defaultCredentialsProvider
    	if accessID == "" {
    		return provider, fmt.Errorf("access key id is empty!")
    	}
    	if accessKey == "" {
    		return provider, fmt.Errorf("access key secret is empty!")
    	}
    	config := &oss.Config{
    		AccessKeyID:     accessID,
    		AccessKeySecret: accessKey,
    		SecurityToken:   token,
    	}
    	return defaultCredentialsProvider{
    		config,
    	}, nil
    }
    
    func main() {
    	client, err := sdk.NewClient()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	secretInfo, err := client.GetSecretInfo("#secretName#")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("SecretValue:%s\n", secretInfo.SecretValue)
    	var m map[string]string
    	err = json.Unmarshal([]byte(secretInfo.SecretValue), &m)
    	if err != nil {
    		fmt.Println("Error decoding JSON:", err)
    		os.Exit(-1)
    	}
    	accessKeyId := m["AccessKeyId"]
    	accessKeySecret := m["AccessKeySecret"]
    	provider, err := NewDefaultCredentialsProvider(accessKeyId, accessKeySecret, "")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
    	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
    	clientOptions = append(clientOptions, oss.Region("yourRegion"))
    	// 設置簽名版本
    	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
    	ossClient, err := oss.New("yourEndpoint", "", "", clientOptions...)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Printf("client:%#v\n", ossClient)
    }
    

方式九:自定義訪問憑證

如果以上憑證配置方式都不滿足要求,您還可以通過實現Credential Providers接口的方式,來自定義憑證提供方式。

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

type CustomerCredentialsProvider struct {
	config *oss.Config
}

func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
	return CustomerCredentialsProvider{}
}

func (s CustomerCredentialsProvider) GetCredentials() oss.Credentials {
	// 返回長期憑證
	config := &oss.Config{
		AccessKeyID:     "id",
		AccessKeySecret: "secret",
	}
	return &CustomerCredentialsProvider{
		config,
	}
	// 返回臨時憑證
	//config := &oss.Config{
	//    AccessKeyID:     "id",
	//    AccessKeySecret: "secret",
	//    SecurityToken:   "token",
	//}
	//return &CustomerCredentialsProvider{
	//    config,
	//}
}

func (s *CustomerCredentialsProvider) GetAccessKeyID() string {
	return s.config.AccessKeyID
}

func (s *CustomerCredentialsProvider) GetAccessKeySecret() string {
	return s.config.AccessKeySecret
}

func (s *CustomerCredentialsProvider) GetSecurityToken() string {
	return s.config.SecurityToken
}

func main() {
	provider := NewCustomerCredentialsProvider()
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 設置簽名版本
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Printf("client:%#v\n", client)
}

后續步驟

配置訪問憑證后,您需要初始化OSSClient。詳情請參見初始化