Go配置访问凭证

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

使用Go SDK发起OSS请求,您需要配置访问凭证。阿里云服务会通过访问凭证验证您的身份信息和访问权限。您可以根据使用场景对认证和授权的要求,选择不同类型的访问凭证。本文介绍如何配置临时访问凭证和长期访问凭证。

注意事项

初始化凭证提供者

凭证提供者选型

OSS支持多种方式初始化凭证提供者,您可以根据使用场景对认证和授权的要求,选择对应的方式初始化凭证提供者。

凭证提供者初始化方式

适用场景

是否需要提供前置的AKSTS Token

底层实现基于的凭证

凭证有效期

凭证轮转或刷新方式

方式一:使用AK

部署运行在安全、稳定且不易受外部攻击的环境的应用程序,无需频繁轮转凭证就可以长期访问云服务

AK

长期

手动轮转

方式二:使用STS Token

部署运行在不可信的环境的应用程序,希望能控制访问的有效期、权限

STS Token

临时

手动刷新

方式三:使用RAMRoleARN

需要授权访问云服务,例如跨阿里云账号访问云服务的应用程序

STS Token

临时

自动刷新

方式四:使用ECSRAMRole

部署运行在阿里云的ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中的应用程序

STS Token

临时

自动刷新

方式五:使用OIDCRoleARN

部署运行在阿里云的容器服务Kubernetes版的Worker节点中的不可信应用程序

STS Token

临时

自动刷新

方式六:自定义凭证提供者

如果以上凭证配置方式都不满足要求时,您可以自定义获取凭证的方式

自定义

自定义

自定义

自定义

方式七:使用默认凭据链

当您初始化凭据客户端,且不传入任何参数时,将会尝试按照默认凭据链顺序查找相关凭据信息

自定义

自定义

自定义

自定义

方式一:使用AK

如果您的应用程序部署运行在安全、稳定且不易受外部攻击的环境中,需要长期访问您的OSS,且不能频繁轮转凭证时,您可以使用阿里云主账号或RAM用户的AK(Access Key ID、Access Key Secret)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个AK,存在安全性风险和维护复杂度增加的风险。如何获取AK,请参见CreateAccessKey - 创建主账号或RAM用户访问密钥

环境变量

警告
  • 阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,不建议使用。推荐使用最小化授权的RAM用户的AK。

  • 如需创建RAM用户的AK,请直接访问创建AccessKey。RAM用户的Access Key ID、Access Key Secret信息仅在创建时显示,请及时保存,如若遗忘请考虑创建新的AK进行轮换。

  1. 使用RAM用户AccessKey配置环境变量。

    Linux
    1. 在命令行界面执行以下命令来将环境变量设置追加到~/.bashrc 文件中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 执行以下命令使变更生效。

      source ~/.bashrc
    3. 执行以下命令检查环境变量是否生效。

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET
    macOS
    1. 在终端中执行以下命令,查看默认Shell类型。

      echo $SHELL
    2. 根据默认Shell类型进行操作。

      Zsh
      1. 执行以下命令来将环境变量设置追加到 ~/.zshrc 文件中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 执行以下命令使变更生效。

        source ~/.zshrc
      3. 执行以下命令检查环境变量是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. 执行以下命令来将环境变量设置追加到 ~/.bash_profile 文件中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 执行以下命令使变更生效。

        source ~/.bash_profile
      3. 执行以下命令检查环境变量是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
    Windows
    CMD
    1. CMD中运行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 运行以下命令,检查环境变量是否生效。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. PowerShell中运行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 运行以下命令,检查环境变量是否生效。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 使用环境变量来传递凭证信息。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET
    	provider := credentials.NewEnvironmentVariableCredentialsProvider()
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", 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 (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	"gopkg.in/ini.v1"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	// 读取配置文件
    	cfgFile, err := ini.Load("config.ini")
    	if err != nil {
    		log.Fatalf("Failed to load config file: %v", err)
    	}
    
    	// 获取配置信息
    	accessKeyID := cfgFile.Section("oss").Key("alibaba_cloud_access_key_id").String()
    	accessKeySecret := cfgFile.Section("oss").Key("alibaba_cloud_access_key_secret").String()
    
    	// 创建凭证提供者
    	provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret)
    
    	// 加载默认配置并设置凭证提供者和区域
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    
    	log.Printf("ossclient: %v", client)
    }
    

方式二:使用STS Token

如果您的应用程序需要临时访问OSS,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key SecretSecurity Token)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个STS Token,存在安全性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问OSS,您需要手动刷新STS Token。

重要
  1. 使用临时身份凭证设置环境变量。

    Mac OS X/Linux/Unix

    警告
    • 请注意,此处使用的是通过STS服务获取的临时身份凭证(Access Key ID、Access Key SecretSecurity Token),而非RAM用户的AK(Access Key ID、Access Key Secret)。

    • 请注意区分STS服务获取的Access Key IDSTS开头,例如“STS.L4aBSCSJVMuKg5U1****”。

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    警告
    • 请注意,此处使用的是通过STS服务获取的临时身份凭证(Access Key ID、Access Key SecretSecurity Token),而非RAM用户的AK(Access Key ID、Access Key Secret)。

    • 请注意区分STS服务获取的Access Key IDSTS开头,例如“STS.L4aBSCSJVMuKg5U1****”。

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. 通过环境变量来传递凭证信息。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET,OSS_SESSION_TOKEN
    	provider := credentials.NewEnvironmentVariableCredentialsProvider()
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", 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 (
    	"context"
    	"log"
    	"os"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	config := new(openapicred.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("Policy").
    		//(可选)限制STS Token的有效时间
    		SetRoleSessionExpiration(3600)
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", 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. 配置访问凭证。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	config := new(openapicred.Config).
    		// 指定Credential类型,固定值为ecs_ram_role
    		SetType("ecs_ram_role").
    		// (可选项)指定角色名称。如果不指定,OSS会自动获取角色。强烈建议指定角色名称,以降低请求次数
    		SetRoleName("RoleName")
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", 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
  2. 配置访问凭证。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	config := new(openapicred.Config).
    		// 指定Credential类型,固定值为oidc_role_arn
    		SetType("oidc_role_arn").
    		// 指定 OIDC 提供者的 ARN(Amazon Resource Name),格式为 acs:ram::account-id:oidc-provider/provider-name
    		SetOIDCProviderArn("OIDCProviderArn").
    		// 指定 OIDC 令牌的文件路径,用于存储 OIDC 令牌
    		SetOIDCTokenFilePath("OIDCTokenFilePath").
    		// 自定义角色会话名称,用于区分不同的令牌
    		SetRoleSessionName("RoleSessionName"). // RoleSessionName默认环境变量规范名称ALIBABA_CLOUD_ROLE_SESSION_NAME
    		// (可选)指定访问角色时要使用的策略
    		SetPolicy("Policy").
    		// 填写角色的ARN信息,即需要扮演的角色ID。格式为acs:ram::113511544585****:oidc-provider/TestOidcProvider
    		SetRoleArn("RoleArn").
    		// 设置会话有效期
    		SetSessionExpiration(3600)
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

方式六:自定义凭证提供者

当以上凭证配置方式不满足要求时,您可以自定义获取凭证的方式。SDK 支持多种实现方式。

  1. 通过credentials.CredentialsProviderFunc接口

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	// 创建自定义凭证提供者
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		// 返回长期凭证
    		return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret"}, nil
    		// 返回临时凭证
    		//return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret",    SecurityToken: "token"}, nil
    	})
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    
  2. 实现credentials.CredentialsProvider接口

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    type CustomerCredentialsProvider struct {
    	// TODO
    }
    
    func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
    	return CustomerCredentialsProvider{}
    }
    
    func (s CustomerCredentialsProvider) GetCredentials(_ context.Context) (credentials.Credentials, error) {
    	// 返回长期凭证
    	return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret"}, nil
    	// 返回临时凭证
    	//return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret",    SecurityToken: "token"}, nil
    }
    
    func main() {
    	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionIDcn-hangzhou
    	region := "cn-hangzhou"
    
    	// 创建自定义凭证提供者
    	provider := NewCustomerCredentialsProvider()
    
    	// 加载默认配置并设置凭证提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 创建OSS客户端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

方式七:使用默认凭据链

当您在初始化凭据客户端不传入任何参数时,Credentials会使用默认凭据链方式初始化客户端。默认凭据的读取逻辑请参见默认凭据链

package main

import (
	"context"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	osscred "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// 请根据实际要求设置region,以实例华东1(杭州)为例,regionID为cn-hangzhou
	region := "cn-hangzhou"
	// 传nil,则会走默认凭证链模式,会自动获取凭证
	arnCredential, gerr := credentials.NewCredential(nil)
	provider := osscred.CredentialsProviderFunc(func(ctx context.Context) (osscred.Credentials, error) {
		if gerr != nil {
			return osscred.Credentials{}, gerr
		}
		cred, err := arnCredential.GetCredential()
		if err != nil {
			return osscred.Credentials{}, err
		}

		return osscred.Credentials{
			AccessKeyID:     *cred.AccessKeyId,
			AccessKeySecret: *cred.AccessKeySecret,
			SecurityToken:   *cred.SecurityToken,
		}, nil
	})

	// 加载默认配置并设置凭证提供者和region
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(provider).
		WithRegion(region)

	// 创建ossClient
	client := oss.NewClient(cfg)
	log.Printf("ossclient: %v", client)
}

常见问题

在使用通过STS服务获取的临时身份凭证去初始化凭证提供者时,误使用RAM用户的AK

当您使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key SecretSecurity Token)初始化访问凭证时,请勿混淆STS服务返回的AKRAM用户的AK,STS对应的AK是以STS开头,示例如下:

image

如何查看RAM用户的AK?是否可以查看旧的AccessKey Secret?

  1. 如需查看RAM用户的AK,请直接参考文档查看RAM用户的AccessKey信息

  2. RAM用户的AccessKey Secret仅在创建时显示,之后无法查看,若已经遗忘则无法找回。您可以直接访问RAM控制台选择具体用户,并创建新的AccessKey进行轮换。详细操作请参见创建AccessKey

如果遇到报错问题该如何查询具体的错误类型?

关于错误类型的查询,OSS文档提供了EC错误码供您参阅,例如关于认证方面的常见报错问题,可参见02-AUTH