Para enviar solicitações ao OSS com o PHP SDK, é necessário configurar credenciais de acesso. Os services da Alibaba Cloud utilizam essas credenciais para verificar sua identidade e permissões de acesso. Escolha entre os diferentes tipos de credenciais de acordo com seus requisitos de autenticação e autorização. Este tópico descreve como configurar credenciais de acesso temporárias e de longo prazo.
Pré-requisitos
Antes de configurar as credenciais de acesso, instale o OSS PHP SDK. Para mais informações, consulte Installation (PHP SDK V1).
Inicializar um provedor de credenciais
Escolha um provedor de credenciais
O OSS oferece suporte a vários métodos para inicializar um provedor de credenciais. Escolha o método mais adequado aos requisitos de autenticação e autorização do seu cenário.
|
Método de inicialização |
Cenário |
Requer AccessKey ou token STS existente |
Credencial subjacente |
Período de validade da credencial |
Método de rotação ou atualização da credencial |
|
Aplicações executadas em ambiente seguro que precisam de acesso de longo prazo aos services da Alibaba Cloud sem rotação frequente de credenciais. |
Sim |
AccessKey |
Longo prazo |
Rotação manual |
|
|
Aplicações executadas em ambiente não confiável onde é necessário controlar o período de validade e as permissões de acesso. |
Sim |
Token STS |
Temporário |
Atualização manual |
|
|
Aplicações que necessitam de acesso autorizado aos services da Alibaba Cloud, como para acesso entre contas. |
Sim |
Token STS |
Temporário |
Atualização automática |
|
|
Aplicações executadas em instâncias ECS, instâncias ECI ou nós de trabalho do Container Service for Kubernetes da Alibaba Cloud. |
Não |
Token STS |
Temporário |
Atualização automática |
|
|
Funções de aplicações executadas no Function Compute da Alibaba Cloud. |
Não |
Token STS |
Temporário |
Não requer atualização |
|
|
Aplicações não confiáveis executadas em nós de trabalho do Container Service for Kubernetes. |
Não |
Token STS |
Temporário |
Atualização automática |
|
|
Aplicações que precisam obter credenciais de acesso de um sistema externo. |
Não |
Token STS |
Temporário |
Atualização automática |
|
|
Caso os métodos anteriores não atendam às suas necessidades, defina um método personalizado para obter credenciais. |
Personalizado |
Personalizado |
Personalizado |
Personalizado |
Método 1: Usar um par de AccessKey
Se sua aplicação for executada em um ambiente seguro e exigir acesso de longo prazo ao OSS sem rotação frequente de credenciais, inicialize o provedor de credenciais usando um par de AccessKey de uma conta Alibaba Cloud ou de um usuário do Resource Access Management (RAM). Um par de AccessKey consiste em um AccessKeyID e um AccessKeySecret. Esse método exige a manutenção manual do par de AccessKey, o que pode aumentar os riscos de segurança e a complexidade de manutenção. Para mais informações, consulte CreateAccessKey - Create an AccessKey pair for an Alibaba Cloud account or a RAM user.
Variáveis de ambiente
Uma conta Alibaba Cloud possui permissões totais sobre seus resources. Se o par de AccessKey de uma conta Alibaba Cloud for vazado, isso representará uma ameaça crítica à segurança. Recomendamos o uso do par de AccessKey de um usuário RAM com as permissões mínimas necessárias.
-
Defina as variáveis de ambiente usando um par de AccessKey.
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> -
Transmita as informações da credencial por meio das variáveis de ambiente.
<?php require_once __DIR__ . '/vendor/autoload.php'; use OSS\Credentials\EnvironmentVariableCredentialsProvider; use OSS\OssClient; use OSS\Core\OssException; try { // Get access credentials from environment variables and save them in the provider. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. $provider = new EnvironmentVariableCredentialsProvider(); // Set Endpoint to the endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set Endpoint to https://oss-cn-hangzhou.aliyuncs.com. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; $bucket = "bucket"; $config = array( "provider" => $provider, "endpoint" => $endpoint, "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); var_dump($ossClient); } catch (OssException $e) { printf($e->getMessage() . "\n"); return; }
Credenciais estáticas
Use variáveis no código para referenciar credenciais. Durante a execução, essas variáveis recebem os valores reais das credenciais provenientes de variáveis de ambiente, arquivos de configuração ou outras fontes de dados externas.
Os passos a seguir mostram um exemplo que utiliza um arquivo de configuração.
-
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> -
Transmita as informações da credencial usando o arquivo de configuração.
<?php if (is_file(__DIR__ . '/../autoload.php')) { require_once __DIR__ . '/../autoload.php'; } if (is_file(__DIR__ . '/../vendor/autoload.php')) { require_once __DIR__ . '/../vendor/autoload.php'; } use OSS\Credentials\StaticCredentialsProvider; use OSS\OssClient; use OSS\Core\OssException; try { $config = parse_ini_file('config.ini'); // Get the AccessKey ID and AccessKey secret. $accessKeyId = $config['alibaba_cloud_access_key_id']; $accessKeySecret = $config['alibaba_cloud_access_key_secret']; $provider = new StaticCredentialsProvider($accessKeyId,$accessKeySecret); $endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; $config = array( "provider" => $provider, "endpoint" => $endpoint, "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); printf($ossClient); } catch (OssException $e) { printf($e->getMessage() . "\n"); return; }
Método 2: Usar um token STS
Caso sua aplicação precise de acesso temporário ao OSS, inicialize o provedor de credenciais utilizando credenciais de identidade temporárias do Security Token Service (STS). Essas credenciais incluem um AccessKeyID, um AccessKeySecret e um token de segurança. Esse método requer a manutenção manual do token STS, o que pode elevar os riscos de segurança e a complexidade de manutenção. Para acessar o OSS várias vezes, atualize manualmente o token STS. Para mais informações, consulte AssumeRole - Get temporary identity credentials for a RAM role.
-
Defina as variáveis de ambiente usando credenciais de identidade temporárias.
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> -
Transmita as informações da credencial por meio das variáveis de ambiente.
<?php require_once __DIR__ . '/vendor/autoload.php'; use OSS\Credentials\EnvironmentVariableCredentialsProvider; use OSS\OssClient; use OSS\Core\OssException; try { // Get access credentials from environment variables and save them in the provider. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are set. $provider = new EnvironmentVariableCredentialsProvider(); // Set Endpoint to the endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set Endpoint to https://oss-cn-hangzhou.aliyuncs.com. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; $bucket = "bucket"; $config = array( "provider" => $provider, "endpoint" => $endpoint, "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); var_dump($ossClient); } catch (OssException $e) { printf($e->getMessage() . "\n"); return; }
Método 3: Usar RAMRoleARN
Este método requer alibabacloud/credentials 1.2.0 ou posterior.
Quando sua aplicação precisar de autorização para acessar o OSS, como em casos de acesso entre contas, utilize RAMRoleARN para inicializar o provedor de credenciais. Esse método usa um token STS como credencial subjacente. Ao especificar o Alibaba Cloud Resource Name (ARN) de uma função RAM, a ferramenta Credentials recupera um token STS do STS e o atualiza automaticamente antes da expiração. Também é possível atribuir um valor ao parâmetro policy para restringir a função RAM a um conjunto menor de permissões. Esse método exige o fornecimento de um par de AccessKey, o que pode aumentar os riscos de segurança e a complexidade de manutenção. Para mais informações sobre como obter um par de AccessKey, consulte CreateAccessKey - Create an AccessKey pair for a RAM user. Para mais informações sobre como obter um RAMRoleARN, consulte CreateRole - Create a RAM role.
-
Adicione a dependência do cliente de credenciais.
composer require alibabacloud/credentials -
Configure as credenciais de acesso.
<?php require_once __DIR__ . '/vendor/autoload.php'; use AlibabaCloud\Credentials\Credential; use OSS\Core\OssException; use OSS\OssClient; use OSS\Credentials\CredentialsProvider; use OSS\Credentials\StaticCredentialsProvider; class AlibabaCloudCredentialsWrapper implements CredentialsProvider { /** * @var Credential */ private $wrapper; public function __construct($wrapper) { $this->wrapper = $wrapper; } public function getCredentials() { $cred = $this->wrapper->getCredential(); $ak = $cred->getAccessKeyId(); $sk = $cred->getAccessKeySecret(); $token = $cred->getSecurityToken(); return new StaticCredentialsProvider($ak, $sk, $token); } } try { $config = new Credential\Config([ // The credential type. Set the value to ram_role_arn. 'type' => 'ram_role_arn', // Get the AccessKey pair (AccessKey ID and AccessKey secret) of the RAM user from environment variables. 'accessKeyId' => getenv('OSS_ACCESS_KEY_ID'), 'accessKeySecret' => getenv('OSS_ACCESS_KEY_SECRET'), // Get the ARN of the RAM role from the environment variable. This is the ID of the role to assume, in the format acs:ram::$accountID:role/$roleName. 'roleArn' => getenv('OSS_STS_ROLE_ARN'), // A custom role session name to distinguish different tokens. 'roleSessionName' => 'yourRoleSessionName', // A custom access policy. 'policy' => '', ]); $credential = new Credential($config); $providerWrapper = new AlibabaCloudCredentialsWrapper($credential); $provider = $providerWrapper->getCredentials(); $config = array( 'provider' => $provider, // For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, use the actual endpoint. 'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com' "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); var_dump($ossClient); } catch (OssException $e) { print $e->getMessage(); }
Método 4: Usar ECSRAMRole
Este método requer alibabacloud/credentials 1.2.0 ou posterior.
Se a aplicação for executada em uma instância ECS, instância ECI ou nó de trabalho do Container Service for Kubernetes, use ECSRAMRole para inicializar o provedor de credenciais. Esse método utiliza um token STS como credencial subjacente. O ECSRAMRole permite anexar uma função RAM a uma instância ECS, instância ECI ou nó de trabalho do Container Service for Kubernetes para atualizar automaticamente o token STS na instância. Essa abordagem elimina os riscos associados à manutenção manual de um par de AccessKey ou de um token STS. Para mais informações sobre como obter um ECSRAMRole, consulte CreateRole - Create a RAM role.
-
Adicione a dependência do cliente de credenciais.
composer require alibabacloud/credentials -
Configure o ECSRAMRole como credencial de acesso.
<?php require_once __DIR__ . '/vendor/autoload.php'; use AlibabaCloud\Credentials\Credential; use OSS\Core\OssException; use OSS\OssClient; use OSS\Credentials\CredentialsProvider; use OSS\Credentials\StaticCredentialsProvider; class AlibabaCloudCredentialsWrapper implements CredentialsProvider { /** * @var Credential */ private $wrapper; public function __construct($wrapper) { $this->wrapper = $wrapper; } public function getCredentials() { $cred = $this->wrapper->getCredential(); $ak = $cred->getAccessKeyId(); $sk = $cred->getAccessKeySecret(); $token = $cred->getSecurityToken(); return new StaticCredentialsProvider($ak, $sk, $token); } } try { $config = new Credential\Config([ // The credential type. Set the value to ecs_ram_role. 'type' => 'ecs_ram_role', 'roleName' => "<role_name>", ]); $credential = new Credential($config); $providerWrapper = new AlibabaCloudCredentialsWrapper($credential); $provider = $providerWrapper->getCredentials(); $config = array( 'provider' => $provider, // For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, use the actual endpoint. 'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com' "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); var_dump($ossClient); } catch (OssException $e) { print $e->getMessage(); }
Método 5: Usar credenciais do contexto do Function Compute
Quando a função da sua aplicação for executada no Function Compute, utilize as credenciais presentes no contexto da função para inicializar o provedor de credenciais. Esse método emprega um token STS como credencial subjacente. O Function Compute obtém um token STS assumindo uma função de service com base na configuração da função. Em seguida, o token STS é transmitido à sua aplicação por meio do parâmetro Credentials no contexto. O token STS tem validade de 36 horas, e esse período não pode ser alterado. Como o tempo máximo de execução de uma função é de 24 horas, o token STS não expira durante a execução da função, eliminando a necessidade de atualização. Esse método remove os riscos ligados à manutenção manual de um par de AccessKey ou de um token STS. Para mais informações sobre como conceder permissões ao Function Compute para acessar o OSS, consulte Use a function role to grant Function Compute permissions to access other Alibaba Cloud services.
-
Inicialize o provedor de credenciais usando as credenciais do contexto do Function Compute.
<?php use OSS\OssClient; use OSS\Core\OssException; function handler($event, $context) { /* An AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user for API access or routine O&M. Do not hard-code your AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of all your resources may be compromised. This example shows how to get the AccessKey ID and AccessKey secret from the context. */ $creds = $context["credentials"]; $accessKeyId = $creds["accessKeyId"]; $accessKeySecret = $creds["accessKeySecret"]; $securityToken = $creds["securityToken"]; $endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com"; try{ $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); print_r($ossClient); } catch(OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return $e->getMessage(); } return 'hello world'; }
Método 6: Usar OIDCRoleARN
Este método requer alibabacloud/credentials 1.2.0 ou posterior.
Após configurar uma função RAM para um nó de trabalho do Container Service for Kubernetes, as aplicações nos pods desse nó podem obter o token STS da função associada diretamente do servidor de metadados. Isso funciona de maneira semelhante às aplicações em uma instância ECS. No entanto, se aplicações não confiáveis forem implantadas no cluster, talvez você não queira que elas obtenham o token STS da função RAM da instância pelo servidor de metadados. Um exemplo seria uma application enviada por um cliente cujo código não está acessível a você. Para proteger seus resources cloud e permitir que essas aplicações não confiáveis obtenham com segurança os tokens STS necessários com permissões mínimas, utilize o recurso RAM Roles for Service Account (RRSA). Esse método usa um token STS como credencial subjacente. Um cluster de contêineres da Alibaba Cloud cria e monta o arquivo de token OpenID Connect (OIDC) da conta de service correspondente para cada pod de aplicação. Ele também injeta as informações de configuração nas variáveis de ambiente. A ferramenta Credentials recupera 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 da função vinculada. Essa abordagem elimina os riscos associados à manutenção manual de um par de AccessKey ou de um token STS. Para mais informações, consulte Pod permission isolation based on RRSA.
-
Adicione a dependência do cliente de credenciais.
composer require alibabacloud/credentials -
O código de exemplo a seguir mostra como configurar a função RAM de um provedor OIDC como credencial de acesso.
<?php require_once __DIR__ . '/vendor/autoload.php'; use OSS\Credentials\CredentialsProvider; use AlibabaCloud\Credentials\Credential; use OSS\Credentials\StaticCredentialsProvider; use OSS\Core\OssException; use OSS\OssClient; class AlibabaCloudCredentialsWrapper implements CredentialsProvider { /** * @var Credential */ private $wrapper; public function __construct($wrapper) { $this->wrapper = $wrapper; } public function getCredentials() { $cred = $this->wrapper->getCredential(); $ak = $cred->getAccessKeyId(); $sk = $cred->getAccessKeySecret(); $token = $cred->getSecurityToken(); return new StaticCredentialsProvider($ak, $sk, $token); } } try { // Initialize the Credentials Client using OIDCRoleArn. $config = new Credential\Config([ // The credential type. 'type' => 'oidc_role_arn', // The ARN of the OIDC provider. You can set oidc_provider_arn using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable. 'oidcProviderArn' => '<OidcProviderArn>', // The path of the OIDC token file. You can set oidc_token_file_path using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable. 'oidcTokenFilePath' => '<OidcTokenFilePath>', // The ARN of the RAM role. Example: acs:ram::123456789012****:role/adminrole. You can set role_arn using the ALIBABA_CLOUD_ROLE_ARN environment variable. 'roleArn' => '<RoleArn>', // The role session name. You can set role_session_name using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. 'roleSessionName' => '<RoleSessionName>', // Optional. A smaller access policy. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} 'policy' => '<Policy>', # Set the session expiration time. 'durationSeconds' => 3600, ]); $credential = new Credential($config); $providerWrapper = new AlibabaCloudCredentialsWrapper($credential); $provider = $providerWrapper->getCredentials(); $config = array( 'provider' => $provider, // For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, use the actual endpoint. 'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com' "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); var_dump($ossClient); } catch (OssException $e) { print $e->getMessage(); }
Método 7: Usar CredentialsURI
Este método requer alibabacloud/credentials 1.2.0 ou posterior.
Caso sua aplicação precise obter credenciais da Alibaba Cloud de um sistema externo para gerenciamento flexível de credenciais e acesso sem chaves, use CredentialsURI para inicializar o provedor de credenciais. Esse método utiliza um token STS como credencial subjacente. A ferramenta Credentials obtém um token STS da URI fornecida para inicializar o cliente de credenciais. Tal método elimina os riscos relacionados à manutenção manual de um par de AccessKey ou de um token STS. O service de backend que fornece a resposta do CredentialsURI deve implementar a lógica para atualizar automaticamente o token STS. Isso garante que sua aplicação tenha sempre uma credencial válida.
-
Adicione a dependência do cliente de credenciais.
composer require alibabacloud/credentials -
O código de exemplo a seguir demonstra como configurar o CredentialsURI como credencial de acesso.
<?php require_once __DIR__ . '/vendor/autoload.php'; use AlibabaCloud\Credentials\Credential; use OSS\Core\OssException; use OSS\Credentials\CredentialsProvider; use OSS\Credentials\StaticCredentialsProvider; use OSS\OssClient; class AlibabaCloudCredentialsWrapper implements CredentialsProvider { /** * @var Credential */ private $wrapper; public function __construct($wrapper) { $this->wrapper = $wrapper; } public function getCredentials() { $cred = $this->wrapper->getCredential(); $ak = $cred->getAccessKeyId(); $sk = $cred->getAccessKeySecret(); $token = $cred->getSecurityToken(); return new StaticCredentialsProvider($ak, $sk, $token); } } try { $config = new Credential\Config([ // The credential type. 'type' => 'credentials_uri', // The URI of the credential, in the format http://local_or_remote_uri/. You can set credentials_uri using the ALIBABA_CLOUD_CREDENTIALS_URI environment variable. 'credentialsURI' => '<CredentialsUri>', ]); $credential = new Credential($config); $providerWrapper = new AlibabaCloudCredentialsWrapper($credential); $provider = $providerWrapper->getCredentials(); $config = array( 'provider' => $provider, // For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, use the actual endpoint. 'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com' "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); var_dump($ossClient); } catch (OssException $e) { print $e->getMessage(); }
Método 8: Usar credenciais de acesso personalizadas
Se nenhum dos métodos anteriores atender aos seus requisitos, defina um provedor de credenciais personalizado implementando a interface Credential Providers.
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\CredentialsProvider;
use OSS\Credentials\Credentials;
use OSS\OssClient;
use OSS\Core\OssException;
class CustomerCredentialsProvider implements CredentialsProvider
{
public function getCredentials()
{
// Return long-term credentials.
return new Credentials('id', 'secret');
// Return temporary credentials.
//return new Credentials('id', 'secret', 'token');
}
}
$provider = new CustomerCredentialsProvider();
try {
$provider = new CustomerCredentialsProvider();
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
printf($ossClient);
} catch (OssException $e) {
printf($e->getMessage() . "\n");
return;
}
Próximos passos
Após inicializar o provedor de credenciais, utilize-o para criar uma instância OSSClient. Para mais informações, consulte Initialization (PHP SDK V1).