Para enviar requisições ao Object Storage Service (OSS) com o Go SDK, é necessário configure credenciais de acesso. A Alibaba Cloud utiliza essas credenciais para verifique sua identidade e suas permissões de acesso. O tipo de credencial escolhido depende dos requisitos de autenticação e autorização da sua aplicação. Este tópico descreve como configure credenciais de acesso temporárias e de longo prazo.
Pré-requisitos
Antes de configure as credenciais de acesso, instale o Go SDK. Para mais informações, consulte Install (Go SDK V1).
Inicializar um provedor de credenciais
Escolha um provedor de credenciais
O OSS oferece diversas formas de inicializar um provedor de credenciais. Escolha a que melhor atende aos requisitos de autenticação e autorização da sua aplicação.
|
Método de inicialização |
Caso de uso |
Par de AccessKey ou token STS necessário |
Tipo de credencial |
Validade da credencial |
Método de rotação ou renovação |
|
Indicado para aplicações em ambientes seguros que precisam de acesso contínuo aos serviços cloud sem rotação frequente de credenciais. |
Sim |
Par de AccessKey |
Longo prazo |
Rotação manual |
|
|
Indicado para aplicações executadas em ambientes não confiáveis que exigem controle sobre a duração e as permissões de acesso. |
Sim |
Token STS |
Temporária |
Renovação manual |
|
|
Para aplicações que precisam de acesso autorizado a serviços cloud, como acesso entre contas. |
Sim |
Token STS |
Temporária |
Renovação automática |
|
|
Indicado para aplicações executadas em instâncias ECS, instâncias ECI ou nós de trabalho do Container Service for Kubernetes (ACK). |
Não |
Token STS |
Temporária |
Renovação automática |
|
|
Adequado para aplicações não confiáveis executadas em nós de trabalho do ACK. |
Não |
Token STS |
Temporária |
Renovação automática |
|
|
Destinado a funções executadas no Alibaba Cloud Function Compute. |
Não |
Token STS |
Temporária |
Renovação desnecessária |
|
|
Recomendado quando a aplicação precisa obter credenciais de acesso de um sistema externo. |
Não |
Token STS |
Temporária |
Renovação automática |
|
|
Para aplicações executadas em ambientes com alto risco de vazamento de par de AccessKey que exigem acesso de longo prazo com rotação frequente. |
Não |
Par de AccessKey |
Longo prazo |
Rotação automática |
|
|
Caso nenhum dos métodos anteriores atenda às suas necessidades, implemente um provedor de credenciais personalizado. |
Personalizado |
Personalizado |
Personalizado |
Personalizado |
Método 1: Usar um par de AccessKey
Se a sua aplicação é executada em um ambiente seguro e estável e precisa de acesso contínuo ao OSS sem rotação frequente de credenciais, inicialize o provedor de credenciais com o par de AccessKey (AccessKey ID e AccessKey Secret) da sua conta Alibaba Cloud ou de um usuário RAM. Esse método exige o gerenciamento manual do par de AccessKey, o que aumenta os riscos de segurança e a sobrecarga de manutenção. Para saber como obter um par de AccessKey, consulte CreateAccessKey.
Variáveis de ambiente
Uma conta Alibaba Cloud tem acesso total a todos os seus recursos. Se o par de AccessKey for vazado, isso representa um risco significativo de segurança para o seu sistema. Não utilize o par de AccessKey de uma conta Alibaba Cloud. Em vez disso, use um par de AccessKey de um usuário RAM com apenas as permissões mínimas necessárias.
-
Defina as variáveis de ambiente para o seu par de AccessKey.
macOS, Linux, or 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> -
Use as variáveis de ambiente para fornecer as credenciais.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // Obtain access credentials from environment variables. Before you run this code sample, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Credenciais estáticas
Referencie as credenciais no código por meio de variáveis. Em tempo de execução, essas variáveis são preenchidas com os valores reais das credenciais carregados a partir de variáveis de ambiente, arquivos de configuração ou outras fontes de dados externas.
O exemplo a seguir utiliza um arquivo de configuração.
Este exemplo requer a biblioteca go-ini. Para instalá-la, execute o seguinte comando:
go get -u github.com/go-ini/ini
-
Crie um arquivo de configuração chamado
config.ini.[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET> -
Use o arquivo de configuração para fornecer as credenciais.
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) } // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 2: Usar um token STS
Se a sua aplicação requer acesso temporário ao OSS, inicialize o provedor de credenciais com credenciais de acesso temporárias (AccessKey ID, AccessKey Secret e um token de segurança) obtidas do Security Token Service (STS). Esse método exige o gerenciamento e a renovação manual do token STS, o que introduz riscos de segurança e sobrecarga de manutenção. Para saber como obter um token STS, consulte AssumeRole.
-
Defina as variáveis de ambiente para suas credenciais temporárias.
macOS, Linux, or 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> -
Use as variáveis de ambiente para fornecer as credenciais.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // Obtain access credentials from environment variables. Before you run this code sample, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are set. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 3: Usar um ARN de função RAM
Se a sua aplicação requer acesso autorizado ao OSS — por exemplo, para acesso entre contas —, inicialize o provedor de credenciais com um ARN de função RAM. Esse método utiliza um token STS. O SDK obtém automaticamente um token STS do STS ao assumir o ARN da função RAM especificada e renova o token antes de sua expiração. Você também pode atribuir uma política para restringir as permissões da função RAM a um conjunto menor. Esse método exige que você forneça um par de AccessKey, o que introduz riscos de segurança e sobrecarga de manutenção. Para saber como obter um par de AccessKey, consulte Create an AccessKey pair for a RAM user. Para saber como obter um ARN de função RAM, consulte Create a RAM role.
-
Adicione a dependência de credenciais.
go get github.com/aliyun/credentials-go/credentials -
Configure as credenciais de acesso.
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). // Specify the credential type. Set the value to ram_role_arn. SetType("ram_role_arn"). // Obtain the AccessKey pair (AccessKeyId and AccessKeySecret) of the RAM user from environment variables. SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")). SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")). // The following operations set parameter values directly. You can also add environment variables and use os.Getenv("") to set the parameters. // Obtain the ARN of the RAM role. The ARN is the ID of the role to be assumed, for example, acs:ram::$accountID:role/$roleName. // The default environment variable for RoleArn is ALIBABA_CLOUD_ROLE_ARN. SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // Specify a custom role session name to distinguish different tokens. // The default environment variable for RoleSessionName is ALIBABA_CLOUD_ROLE_SESSION_NAME. SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // (Optional) Limit the permissions of the STS token. SetPolicy(""). // (Optional) Limit the validity period of the STS token. SetRoleSessionExpiration(3600) arnCredential, err := credentials.NewCredential(config) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } provider := NewRamRoleArnCredentialsProvider(arnCredential) // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 4: Usar uma função RAM do ECS
Se a sua aplicação é executada em uma instância ECS, em uma instância Elastic Container Instance (ECI) ou em um nó de trabalho do ACK, inicialize o provedor de credenciais com uma função RAM do ECS. Ao associar uma função RAM à instância, o SDK recupera e renova automaticamente os tokens STS temporários. Esse método melhora a segurança ao eliminar a necessidade de gerencie pares de AccessKey ou tokens STS manualmente. Para saber como obter uma função RAM do ECS, consulte Create a RAM role.
-
Adicione a dependência de credenciais.
go get github.com/aliyun/credentials-go/credentials -
Configure uma função RAM do ECS como credenciais de acesso.
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). // Specify the credential type. Set the value to ecs_ram_role. SetType("ecs_ram_role"). // (Optional) Specify the role name. If you do not specify a role name, the SDK automatically obtains the role. Specify a role name to reduce requests. SetRoleName("RoleName") ecsCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewEcsCredentialsProvider(ecsCredential) // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 5: Usar um ARN de função OIDC
Após configure uma função RAM para os nós de trabalho no ACK, as aplicações nos pods desses nós podem obter o token STS da função associada por meio do Metadata Service, de forma semelhante às aplicações implantadas no ECS. No entanto, ao implantar aplicações não confiáveis no cluster de contêineres — por exemplo, aplicações enviadas por seus clientes com código fechado —, talvez você não queira que elas obtenham o token STS da função RAM da instância associada aos nós de trabalho. Para proteger seus recursos cloud e, ao mesmo tempo, permitir que essas aplicações não confiáveis obtenham com segurança o token STS necessário e alcancem a minimização de permissões em nível de aplicação, utilize o recurso RAM Roles for Service Accounts (RRSA). Esse método usa um token STS. O cluster de contêineres da Alibaba Cloud cria e monta o arquivo de token OIDC da conta de service correspondente para diferentes pods de aplicação e injeta as informações de configuração relevantes nas variáveis de ambiente. A ferramenta de credenciais obtém a configuração das variáveis de ambiente e chama a operação AssumeRoleWithOIDC do STS para trocar o token OIDC por um token STS vinculado à função. Esse método não exige que você forneça um par de AccessKey ou token STS, eliminando os riscos do gerenciamento manual. Para mais informações, consulte Use RRSA for pod-level access control.
-
Adicione a dependência de credenciais.
go get github.com/aliyun/credentials-go/credentials
-
Configure a função RAM OIDC como credenciais de acesso.
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). // Specify the file path for the OIDC token. SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")). // The following operations set parameter values directly. You can also add environment variables and use os.Getenv("") to set the parameters. // Specify the credential type. Set the value to oidc_role_arn. SetType("oidc_role_arn"). // Specify the ARN of the OIDC provider, for example, acs:ram::113511544585****:oidc-provider/TestOidcProvider. // The default environment variable for OIDCProviderArn is ALIBABA_CLOUD_OIDC_PROVIDER_ARN. SetOIDCProviderArn("acs:ram::113511544585****:oidc-provider/TestOidcProvider"). // Specify a custom role session name to distinguish different tokens. // The default environment variable for RoleSessionName is ALIBABA_CLOUD_ROLE_SESSION_NAME. SetRoleSessionName("role_session_name"). // Specify the ARN of the role to be assumed, for example, acs:ram::113511544585****:role/testoidc. // The default environment variable for RoleArn is ALIBABA_CLOUD_ROLE_ARN. SetRoleArn("acs:ram::113511544585****:role/testoidc"). // (Optional) Specify the policy to use when assuming the role. SetPolicy(""). SetSessionExpiration(3600) oidcCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewOIDCRoleARNCredentialsProvider(oidcCredential) // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 6: Usar credenciais do contexto do Function Compute
Se a função da sua aplicação é executada no Function Compute (FC), inicialize o provedor de credenciais com as credenciais do contexto do FC. Esse método utiliza um token STS. Com base na função configure para o FC, o service obtém um token STS ao assumir uma função de service e o passa para a sua aplicação por meio do parâmetro de credenciais no contexto. Esse token STS é válido por 36 horas e não pode ser modificado. Como o tempo máximo de execução de uma função é de 24 horas, o token permanece válido durante toda a execução, eliminando a necessidade de lógica de renovação manual. Esse método não exige que você forneça um par de AccessKey ou token STS, o que elimina os riscos do gerenciamento manual. Para saber como conceder permissões ao FC para acessar o OSS, consulte Use a function role to access other cloud services.
-
Adicione as dependências do contexto do FC.
go get github.com/aliyun/fc-runtime-go-sdk/fc go get github.com/aliyun/fc-runtime-go-sdk/fccontext -
Inicialize o provedor de credenciais com as credenciais do contexto do FC.
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) }
Método 7: Usar um CredentialsURI
Se a sua aplicação precisa obter credenciais da Alibaba Cloud de um sistema externo para um gerenciamento flexível de credenciais e acesso sem chaves, inicialize o provedor de credenciais com um CredentialsURI. Esse método utiliza um token STS. A ferramenta de credenciais obtém um token STS do URI fornecido para inicializar o cliente de credenciais. Esse método não exige que você forneça um par de AccessKey ou token STS, o que elimina os riscos do gerenciamento manual. O service de backend que responde ao CredentialsURI deve implementar a lógica de renovação automática do token STS para garantir que sua aplicação sempre disponha de credenciais válidas.
-
Para que o SDK analise e utilize corretamente o token STS, o service no URI especificado deve obedecer ao seguinte protocolo de resposta:
Código de status da resposta: 200
-
Estrutura do corpo da resposta:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
-
Adicione a dependência de credenciais.
go get github.com/aliyun/credentials-go/credentials -
Configure o CredentialsURI como credenciais de acesso.
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). // Specify the credential type. Set the value to credentials_uri. SetType("credentials_uri"). // Specify the URL. You can also set this parameter by using an environment variable and os.Getenv(""). // The default environment variable for the URL is ALIBABA_CLOUD_CREDENTIALS_URI. SetURLCredential("http://127.0.0.1") uriCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewCredentialsUriCredentialsProvider(uriCredential) // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 8: Usar um par de AccessKey com rotação automática
Se a sua aplicação requer acesso de longo prazo ao OSS, mas opera em um ambiente com alto risco de vazamento de par de AccessKey e necessita de rotação frequente de credenciais, inicialize o provedor de credenciais com um ClientKey. Esse método utiliza um par de AccessKey. Com o ClientKey, o Key Management Service (KMS) rotaciona automática e periodicamente o par de AccessKey do usuário RAM gerenciado, transformando um par de AccessKey estático em dinâmico para reduzir o risco de vazamentos. Além da rotação periódica, o KMS também suporta rotação imediata, permitindo substituir rapidamente um par de AccessKey comprometido. Esse método elimina a necessidade de gerencie manualmente um par de AccessKey, reduzindo os riscos de segurança e a sobrecarga de manutenção. Para saber como obter um ClientKey, consulte Create an application access point.
-
Execute o comando
go getpara usar o Secret Client no seu projeto.go get -u github.com/aliyun/aliyun-secretsmanager-client-go -
Crie um arquivo de configuração chamado
secretsmanager.properties.# Credential type credentials_type=client_key # Read the decryption password for the client key. Supports reading from an environment variable or a file. 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# # Path to the ClientKey private key file client_key_private_key_path=#your client key private key file path# # Associated KMS region cache_client_region_id=[{"regionId":"#regionId#"}] -
Inicialize o cliente OSS com as credenciais rotacionadas.
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) } // Set yourEndpoint to the bucket's endpoint and yourRegion to its region. // For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. 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) }
Método 9: Implementar um provedor de credenciais personalizado
Se nenhum dos métodos de configuração de credenciais anteriores atender às suas necessidades, crie um provedor personalizado implementando a interface oss.CredentialsProvider.
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 {
// Return long-term access credentials.
config := &oss.Config{
AccessKeyID: "id",
AccessKeySecret: "secret",
}
return &CustomerCredentialsProvider{
config,
}
// Return temporary access credentials.
//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()
// Set yourEndpoint to the bucket's endpoint and yourRegion to its region.
// For a bucket in the China (Hangzhou) region, an example endpoint is https://oss-cn-hangzhou.aliyuncs.com and the region is cn-hangzhou.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Set the signature version.
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)
}
Próximas etapas
Após configure as credenciais de acesso, inicialize um cliente OSS. Para mais informações, consulte Configure a client (Go SDK V1).