管理訪問憑據
本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
當您通過阿里云SDK調用OpenAPI進行資源操作時,必須正確配置憑證信息。阿里云的Credentials工具提供了一套強大的功能,使您能夠輕松地獲取和管理這些訪問憑證。無論是利用默認憑證,AccessKey(AK),還是安全令牌服務(STS)令牌等,Credentials工具都能為您提供相應支持。此外,本文檔將詳細闡述如何根據優先級使用默認憑證。您將深入理解如何在阿里云SDK中配置和維護憑證,從而確保您對云資源的操作既有效率又具有高度安全性。
背景信息
憑據是指用戶證明其身份的一組信息。用戶在系統中進行登錄時,需要提供正確的憑據才能驗證身份。常見的憑據類型有:
阿里云主賬號和RAM用戶的永久憑據 AccessKey(簡稱AK)是由AccessKey ID和AccessKey Secret組成的密鑰對。
阿里云RAM角色的STS臨時訪問Token,簡稱STS Token。它是可以自定義時效和訪問權限的臨時身份憑據,詳情請參見什么是STS。
Bearer Token。它是一種身份驗證和授權的令牌類型。
前提條件
使用Credentials工具要求PHP版本 >= 5.6。強烈建議您使用cURL擴展,并使用TLS后端編譯cURL 7.16.2+。
使用V2.0代系的阿里云SDK。
安裝Credentials工具
如果已在系統上全局安裝 Composer,請直接在項目目錄中運行以下內容來安裝 Alibaba Cloud Credentials for PHP 作為依賴項:
composer require alibabacloud/credentials
使用最新發布Credentials依賴包,確保所有憑證支持。
請查看CHANGELOG.md獲取所有已發布的版本列表。
初始化憑據客戶端
Credentials工具支持多種方式初始化憑據客戶端,您可根據實際情況選擇合適的方式進行憑據客戶端初始化。
在項目中使用明文AccessKey,容易因代碼倉庫權限管理不當造成AccessKey泄露,會威脅該賬號下所有資源的安全。建議通過環境變量、配置文件等方式獲取AccessKey。
方式一:使用默認憑據鏈
當您在初始化憑據客戶端不傳入任何參數時,Credentials工具會使用默認憑據鏈方式初始化客戶端。默認憑據的讀取邏輯請參見默認憑據鏈。
<?php
use AlibabaCloud\Credentials\Credential;
// 不指定參數
$credential = new Credential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
接口調用方法
本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
// 使用默認憑證初始化Credentials Client。
$credentialClient = new Credential();
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credentialClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);
// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);
// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);
// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 輸出狀態碼
echo $resp->statusCode;
// 輸出響應
var_dump($resp);
方式二:使用AK
阿里云賬號、RAM用戶可生成調用OpenAPI的密鑰對AK。如何獲取AK請參見文檔創建AccessKey。您可使用AK初始化憑據客戶端。
阿里云主賬號擁有資源的全部權限,AK一旦泄露,會給系統帶來巨大風險,不建議使用。
推薦使用最小化授權的RAM用戶的AK。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
$credConfig = new Config([
'type' => 'access_key',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
接口調用方法
通過Credentials工具讀取AK,完成云產品OpenAPI接口的調用。
本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。
<?php
namespace AlibabaCloud\SDK\Sample;
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
// 使用AK 初始化Credentials Client。
$credConfig = new CredentialConfig([
'type' => 'access_key',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
]);
$credClient = new Credential($credConfig);
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);
// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);
// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);
// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 輸出狀態碼
echo $resp->statusCode;
// 輸出響應
var_dump($resp);
方式三:使用STS Token
以一個RAM用戶的身份調用STS服務的AssumeRole接口,設置Token的最大過期時間,即可換取到臨時憑據STS Token。以下示例演示如何使用STS Token初始化憑據客戶端(不包含如何獲取到STS Token的過程)。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
$credConfig = new Config([
'type' => 'sts',
// 從環境變量中獲取AccessKey ID的值
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
// 從環境變量中獲取AccessKey Secret的值
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// 從環境變量中獲取STS Token的值
'securityToken' => getenv('ALIBABA_CLOUD_SECURITY_TOKEN'),
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
接口調用方法
通過Credentials工具讀取臨時安全令牌(STS Token),完成云產品OpenAPI接口的調用。
本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK和STS SDK。
<?php
namespace AlibabaCloud\SDK\Sample;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\SDK\Sts\V20150401\Models\AssumeRoleRequest;
use AlibabaCloud\SDK\Sts\V20150401\Sts;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// 創建STS Client,并調用assumeRole方法獲取臨時憑證。
$config = new Config([
// 從環境變量獲取AccessKeyId、AccessKeySecret,如果未設置,請設置后運行。
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
'regionId' => 'cn-hangzhou',
]);
$stsClient = new Sts($config);
$request = new AssumeRoleRequest([
// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置roleArn
'roleArn' => '<RoleArn>',
// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置roleSessionName
'roleSessionName' => '<RoleSessionName>',
]);
$assumeRoleResp = $stsClient->assumeRole($request);
$assumeRoleCredentials = $assumeRoleResp->body->credentials;
// 使用STS Token初始化Credentials Client。
$credentialConfig = new CredentialConfig([
// 憑證類型。
'type' => 'sts',
'accessKeyId' => $assumeRoleCredentials->accessKeyId,
'accessKeySecret' => $assumeRoleCredentials->accessKeySecret,
'securityToken' => $assumeRoleCredentials->securityToken,
]);
$credentialClient = new Credential($credentialConfig);
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credentialClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);// 輸出狀態碼
echo $resp->statusCode;// 輸出響應
var_dump($resp);
方式四:使用AK及RamRoleArn
該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具可以幫助開發者前往STS換取STS Token。您也可以通過為policy
賦值來限制RAM角色到一個更小的權限集合。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
$credConfig = new Config([
'type' => 'ram_role_arn',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置role_arn
'roleArn' => '<RoleArn>',
// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置role_session_name
'roleSessionName' => '<RoleSessionName>',
// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
'policy' => '<Policy>',
// 會話過期時間,非必填,默認值3600
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
接口調用方法
本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。
<?php
namespace AlibabaCloud\SDK\Sample;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// 使用AK和RamRoleArn初始化Credentials Client。
$credentialConfig = new CredentialConfig([
// 憑證類型。
'type' => 'ram_role_arn',
// 從環境變量中獲取AccessKey ID值。
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
// 從環境變量中獲取AccessKey Secret值。
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置role_arn
'roleArn' => '<RoleArn>',
// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置role_session_name
'roleSessionName' => '<RoleSessionName>',
// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
'policy' => '<Policy>',
// 會話過期時間,非必填,默認值3600
'roleSessionExpiration' => 3600,
]);
$credentialClient = new Credential($credentialConfig);
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credentialClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);
// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);
// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);
// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 輸出狀態碼
echo $resp->statusCode;
// 輸出響應
var_dump($resp);
方式五:使用ECS實例RAM角色
ECS和ECI實例均支持綁定實例RAM角色,當在實例中使用Credentials工具時,將自動獲取實例綁定的RAM角色,并通過訪問元數據服務獲取RAM角色的STS Token,以完成憑據客戶端的初始化。
實例元數據服務器支持加固模式和普通模式兩種訪問方式,Credentials工具默認使用加固模式(IMDSv2)獲取訪問憑據。若使用加固模式時發生異常,您可以通過設置disableIMDSv1
來執行不同的異常處理邏輯:
當值為
false
(默認值)時,會使用普通模式繼續獲取訪問憑據。當值為
true
時,表示只能使用加固模式獲取訪問憑據,會拋出異常。
服務端是否支持IMDSv2,取決于您在服務器的配置。
關于ECS實例元數據的介紹,請參見實例元數據。
如何為ECS和ECI實例授予RAM角色,具體操作請參見創建ECS實例RAM角色并授予給ECS和為ECI實例授予實例RAM角色。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
$credConfig = new Config([
'type' => 'ecs_ram_role',
// 選填,該ECS角色的角色名稱,不填會自動獲取,但是建議加上以減少請求次數,可以通過環境變量ALIBABA_CLOUD_ECS_METADATA設置role_name
'roleName' => '<RoleName>',
// 'disableIMDSv1' => false,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
接口調用方法
<?php
namespace AlibabaCloud\SDK\Sample;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// 使用ECS實例RAM角色初始化Credentials Client。
$credConfig = new CredentialConfig([
'type' => 'ecs_ram_role',
// 選填,該ECS角色的角色名稱,不填會自動獲取,但是建議加上以減少請求次數,可以通過環境變量ALIBABA_CLOUD_ECS_METADATA設置role_name
'roleName' => '<RoleName>',
]);
$credClient = new Credential($credConfig);
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);
// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);
// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);
// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 輸出狀態碼
echo $resp->statusCode;
// 輸出響應
var_dump($resp);
方式六:使用OIDCRoleArn
在容器服務 Kubernetes 版中設置了Worker節點RAM角色后,對應節點內的Pod中的應用也就可以像ECS上部署的應用一樣,通過元數據服務(Meta Data Server)獲取關聯角色的STS Token。但如果容器集群上部署的是不可信的應用(比如部署您的客戶提交的應用,代碼也沒有對您開放),您可能并不希望它們能通過元數據服務獲取Worker節點關聯實例RAM角色的STS Token。為了避免影響云上資源的安全,同時又能讓這些不可信的應用安全地獲取所需的 STS Token,實現應用級別的權限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。阿里云容器集群會為不同的應用Pod創建和掛載相應的服務賬戶OIDC Token文件,并將相關配置信息注入到環境變量中,Credentials工具通過獲取環境變量的配置信息,調用STS服務的AssumeRoleWithOIDC - OIDC角色SSO時獲取扮演角色的臨時身份憑證接口換取綁定角色的STS Token。詳情請參見通過RRSA配置ServiceAccount的RAM權限實現Pod權限隔離。
注入的環境變量如下:
ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;
ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;
ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
// 使用OIDCRoleArn初始化Credentials Client。
$credConfig = new CredentialConfig([
// 憑證類型。
'type' => 'oidc_role_arn',
// OIDC提供商ARN,可以通過環境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設置oidc_provider_arn
'oidcProviderArn' => '<OidcProviderArn>',
// OIDC Token文件路徑,可以通過環境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設置oidc_token_file_path
'oidcTokenFilePath' => '<OidcTokenFilePath>',
// RAM角色名稱ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置role_arn
'roleArn' => '<RoleArn>',
// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置role_session_name
'roleSessionName' => '<RoleSessionName>',
// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
'policy' => '<Policy>',
// 設置session過期時間,非必填。
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
接口調用方法
本示例以調用云服務器ECS的DescribeRegions接口為例,因此需先安裝ECS SDK。
<?php
namespace AlibabaCloud\SDK\Sample;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// 使用OIDCRoleArn初始化Credentials Client。
$credConfig = new CredentialConfig([
// 憑證類型。
'type' => 'oidc_role_arn',
// OIDC提供商ARN,可以通過環境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設置oidc_provider_arn
'oidcProviderArn' => '<OidcProviderArn>',
// OIDC Token文件路徑,可以通過環境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設置oidc_token_file_path
'oidcTokenFilePath' => '<OidcTokenFilePath>',
// RAM角色名稱ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置role_arn
'roleArn' => '<RoleArn>',
// 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置role_session_name
'roleSessionName' => '<RoleSessionName>',
// 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
'policy' => '<Policy>',
// 設置session過期時間,非必填。
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);
// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);
// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);
// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 輸出狀態碼
echo $resp->statusCode;
// 輸出響應
var_dump($resp);
方式七:使用URI憑據
該方案底層實現是STS Token。Credentials工具通過您提供的URI獲取STS Token,完成憑據客戶端初始化。
<?php
namespace AlibabaCloud\SDK\Sample;
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// 使用URI憑據初始化Credentials Client。
$credConfig = new Config([
// 憑證類型。
'type' => 'credentials_uri',
// 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變量ALIBABA_CLOUD_CREDENTIALS_URI設置credentials_uri
'credentialsURI' => '<CredentialsUri>',
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
接口調用方法
<?php
namespace AlibabaCloud\SDK\Sample;
// composer 自動加載機制,require_once(vendor目錄下autoload.php文件)
require_once('vendor/autoload.php');
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;
// 使用URI憑據初始化Credentials Client。
$credConfig = new CredentialConfig([
// 憑證類型。
'type' => 'credentials_uri',
// 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變量ALIBABA_CLOUD_CREDENTIALS_URI設置credentials_uri
'credentialsURI' => '<CredentialsUri>',
]);
$credClient = new Credential($credConfig);
$ecsConfig = new Config([
// 使用 credential 配置憑證
'credential' => $credClient,
// 產品服務域名
'endpoint' => 'ecs.aliyuncs.com'
]);
// 初始化ECS client
$ecsClient = new Ecs($ecsConfig);
// 初始化 request
$describeRegionsRequest = new DescribeRegionsRequest([]);
// 初始化運行時配置
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 輸出狀態碼
echo $resp->statusCode;
// 輸出響應
var_dump($resp);
方式八:使用Bearer Token
目前只有云呼叫中心CCC這款產品支持Bearer Token的憑據初始化方式。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
$credConfig = new Config([
'type' => 'bearer',
// 填入您的Bearer Token
'bearerToken' => '<BearerToken>',
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getBearerToken();
$credential->getSignature();
接口調用方法
默認憑據鏈
當您的程序開發環境和生產環境采用不同的憑據類型,常見做法是在代碼中獲取當前環境信息,編寫獲取不同憑據的分支代碼。借助Credentials工具的默認憑據鏈,您可以用同一套代碼,通過程序之外的配置來控制不同環境下的憑據獲取方式。當您在不傳入參數的情況下,直接使用$credential = new Credential();
初始化憑據客戶端時,阿里云SDK將會嘗試按照如下順序查找相關憑據信息。
1. 使用環境變量
若不存在優先級更高的憑據信息,Credentials工具會優先在環境變量中獲取憑據信息。
如果系統環境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key) 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value) 不為空,Credentials工具會優先使用它們作為默認憑據。
如果系統環境變量ALIBABA_CLOUD_ACCESS_KEY_ID(密鑰Key)、ALIBABA_CLOUD_ACCESS_KEY_SECRET(密鑰Value)、ALIBABA_CLOUD_SECURITY_TOKEN(Token)均不為空,Credentials工具會優先使用STS Token作為默認憑據。
2. 使用OIDC RAM角色
若不存在優先級更高的憑據信息,Credentials工具會在環境變量中獲取如下內容:
ALIBABA_CLOUD_ROLE_ARN:RAM角色名稱ARN;
ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;
ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路徑;
若以上三個環境變量都已設置內容,Credentials將會使用變量內容調用STS服務的AssumeRoleWithOIDC - OIDC角色SSO時獲取扮演角色的臨時身份憑證接口換取STS Token作為默認憑據。
3. 使用config.json配置文件
若不存在優先級更高的憑據信息,Credentials工具會優先在如下位置查找config.json文件是否存在:
Linux系統:~/.aliyun/config.json
Windows系統: C:\Users\USER_NAME\.aliyun\config.json
如果文件存在,程序將會使用配置文件中current 指定的憑據信息初始化憑據客戶端。當然,您也可以通過環境變量 ALIBABA_CLOUD_PROFILE 來指定憑據信息,例如設置 ALIBABA_CLOUD_PROFILE 的值為client1。
在config.json配置文件中每個mode的值代表了不同的憑據信息獲取方式:
AK:使用用戶的Access Key作為憑據信息;
RamRoleArn:使用RAM角色的ARN來獲取憑據信息;
EcsRamRole:利用ECS綁定的RAM角色來獲取憑據信息;
OIDC:通過OIDC ARN和OIDC Token來獲取憑據信息;
ChainableRamRoleArn:采用角色鏈的方式,通過指定JSON文件中的其他憑據,以重新獲取新的憑據信息。
配置示例信息如下:
{
"current": "default",
"profiles": [
{
"name": "default",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name":"client1",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"client2",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"client3",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"client4",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
4. 使用ECS實例RAM角色
若不存在優先級更高的憑據信息,Credentials工具將通過環境變量獲取ALIBABA_CLOUD_ECS_METADATA(ECS實例RAM角色名稱)的值。若該變量的值存在,程序將采用加固模式(IMDSv2)訪問ECS的元數據服務(Meta Data Server),以獲取ECS實例RAM角色的STS Token作為默認憑據信息。在使用加固模式時若發生異常,將使用普通模式兜底來獲取訪問憑據。您也可以通過設置環境變量ALIBABA_CLOUD_IMDSV1_DISABLED,執行不同的異常處理邏輯:
當值為
false
時,會使用普通模式繼續獲取訪問憑據。當值為
true
時,表示只能使用加固模式獲取訪問憑據,會拋出異常。
服務端是否支持IMDSv2,取決于您在服務器的配置。
5. 使用Credentials工具URI
若不存在優先級更高的憑據信息,Credentials工具會在環境變量中獲取ALIBABA_CLOUD_CREDENTIALS_URI,若存在,程序將請求該URI地址,獲取臨時安全憑證作為默認憑據信息。
自定義憑證提供程序鏈
可通過自定義程序鏈代替默認程序鏈的尋找順序,也可以自行編寫閉包傳入提供者。
<?php
use AlibabaCloud\Credentials\Providers\ChainProvider;
ChainProvider::set(
ChainProvider::ini(),
ChainProvider::env(),
ChainProvider::instance()
);
如何切換憑據
當您想要在程序中使用不同的訪問憑據調用不同OpenAPI時,可以通過如下方式。
使用多個憑據客戶端
通過初始化多個憑據客戶端,傳入到不同的接口請求客戶端。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
$credConfig = new Config([
'type' => 'access_key',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
]);
$credClient1 = new Credential($credConfig);
$credConfig = new Config([
'type' => 'sts',
// 從環境變量中獲取AccessKey ID的值
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
// 從環境變量中獲取AccessKey Secret的值
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// 從環境變量中獲取STS Token的值
'securityToken' => getenv('ALIBABA_CLOUD_SECURITY_TOKEN'),
]);
$credClient2 = new Credential($credConfig);