本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
使用Java SDK發起OSS請求,您需要配置訪問憑證。阿里云服務會通過訪問憑證驗證您的身份信息和訪問權限。您可以根據使用場景對認證和授權的要求,選擇不同的方式提供憑證。
前提條件
在配置訪問憑證前,您需要安裝OSS Java SDK。詳情請參見安裝。
初始化憑證提供者
憑證提供者選型
OSS支持多種方式初始化憑證提供者,您可以根據使用場景對認證和授權的要求,選擇對應的方式初始化憑證提供者。
憑證提供者初始化方式 | 適用場景 | 是否需要提供前置的AK或STS Token | 底層實現基于的憑證 | 憑證有效期 | 憑證輪轉或刷新方式 |
部署運行在安全、穩定且不易受外部攻擊的環境的應用程序,無需頻繁輪轉憑證就可以長期訪問云服務 | 是 | AK | 長期 | 手動輪轉 | |
部署運行在面臨AK泄露風險的環境的應用程序,需要頻繁輪轉憑證才長期能訪問云服務 | 否 | AK | 長期 | 自動輪轉 | |
部署運行在不可信的環境的應用程序,希望能控制訪問的有效期、權限 | 是 | STS Token | 臨時 | 手動刷新 | |
需要授權訪問云服務,例如跨阿里云賬號訪問云服務的應用程序 | 是 | STS Token | 臨時 | 自動刷新 | |
部署運行在阿里云的ECS實例、ECI實例、容器服務Kubernetes版的Worker節點中的應用程序 | 否 | STS Token | 臨時 | 自動刷新 | |
部署運行在阿里云的容器服務Kubernetes版的Worker節點中的不可信應用程序 | 否 | STS Token | 臨時 | 自動刷新 | |
部署運行在阿里云函數計算中的應用程序的函數 | 否 | STS Token | 臨時 | 無需刷新 | |
需要通過外部系統獲取訪問憑證的應用程序 | 否 | STS Token | 臨時 | 自動刷新 | |
如果以上憑證配置方式都不滿足要求時,您可以自定義獲取憑證的方式 | 自定義 | 自定義 | 自定義 | 自定義 |
方式一:使用AK
如果您的應用程序部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的OSS,且不能頻繁輪轉憑證時,您可以使用阿里云主賬號或RAM用戶的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護復雜度增加的風險。如何獲取AK,請參見CreateAccessKey - 創建主賬號或RAM用戶訪問密鑰。
環境變量
阿里云賬號擁有資源的全部權限,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM用戶的AK。
使用AK設置環境變量。
Mac OS X/Linux/Unix
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
使用環境變量來傳遞憑證信息。
import com.aliyun.oss.common.auth.CredentialsProviderFactory; import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider; public class AkDemoTest { public static void main(String[] args) throws Exception { // 從環境變量中獲取憑證 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 使用credentialsProvider進行后續操作... } }
靜態憑證
您可以在代碼中使用變量來引用憑證,這些變量在運行時會被環境變量、配置文件或其他外部數據源中的實際憑證值填充。
以下操作步驟以配置文件為例。
創建配置文件
config.ini
。[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
使用配置文件來傳遞憑證信息。
import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider; import java.io.FileInputStream; import java.util.Properties; public class AkDemoTest { public static void main(String[] args) throws Exception { Properties properties = new Properties(); // 設置config.ini文件路徑 String configFilePath = "config.ini"; // 讀取配置文件 FileInputStream input = new FileInputStream(configFilePath); properties.load(input); input.close(); // 從配置文件中獲取AK和SK String accessKeyId = properties.getProperty("alibaba_cloud_access_key_id"); String accessKeySecret = properties.getProperty("alibaba_cloud_access_key_secret"); CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret); // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式二:使用自動輪轉的AK
如果您的應用程序需要長期訪問您的OSS,但部署運行的環境面臨AK泄露的風險,需要頻繁手動輪轉(輪換)AK,您可以使用ClientKey初始化憑證提供者。該方式底層實現是AK。使用ClientKey后,密鑰管理服務(KMS)可以對托管的RAM用戶AK進行全自動的定期輪轉,將靜態的RAM用戶AK動態化,從而降低AK泄漏的風險。除定期輪轉外,KMS還支持立即輪轉,在AK泄漏情況下快速更換AK。該方式無需您手動維護一個AK,從而降低安全性風險和維護復雜度增加的風險。如何獲取ClientKey,請參見創建應用接入點。
添加憑據客戶端依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/alibabacloud-secretsmanager-client --> <dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-secretsmanager-client</artifactId> <version>1.3.7</version> </dependency> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.7.0</version> </dependency>
創建配置文件
secretsmanager.properties
。# 訪問憑據類型,固定為client_key credentials_type=client_key # 讀取Client Key的解密密碼:支持從環境變量或者文件讀取,只需設置一種 client_key_password_from_env_variable=<your client key private key password environment variable name> client_key_password_from_file_path=<your client key private key password file path> # Client Key的私鑰文件路徑 client_key_private_key_path=<your client key private key file path> # 關聯的KMS服務地域 cache_client_region_id=[{"regionId":"<regionId>"}]
使用配置文件來傳遞憑證信息。
import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; public class ClientKeyDemoTest { public static void main(String[] args) throws CacheSecretException { final SecretCacheClient client = SecretCacheClientBuilder.newClient(); CredentialsProvider credentialsProvider = new CredentialsProvider() { @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { try { SecretInfo secretInfo = client.getSecretInfo("<secretName>"); JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue()); String accessKeyId = jsonObject.getString("AccessKeyId"); String accessKeySecret = jsonObject.getString("AccessKeySecret"); return new DefaultCredentials(accessKeyId, accessKeySecret); } catch (CacheSecretException | JSONException e) { return null; } } }; // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式三:使用STS Token
如果您的應用程序需要臨時訪問OSS,您可以使用通過STS服務獲取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個STS Token,存在安全性風險和維護復雜度增加的風險。此外,如果您需要多次臨時訪問OSS,您需要手動刷新STS Token。如何獲取STS Token,請參見AssumeRole - 獲取扮演角色的臨時身份憑證。
環境變量
使用臨時身份憑證設置環境變量。
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>
通過環境變量來傳遞憑證信息。
import com.aliyun.oss.common.auth.CredentialsProviderFactory; import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider; public class StsDemoTest { public static void main(String[] args) throws Exception { // 從環境變量中獲取憑證 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 使用credentialsProvider初始化客戶端并進行后續操作... } }
靜態憑證
您可以在代碼中使用變量來引用憑證,這些變量在運行時會被環境變量、配置文件或其他外部數據源中的實際憑證值填充。
創建配置文件
config.ini
。[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET> alibaba_cloud_security_token = <ALIBABA_CLOUD_SECURITY_TOKEN>
使用配置文件來傳遞憑證信息。
import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider; import java.io.FileInputStream; import java.util.Properties; public class AkDemoTest { public static void main(String[] args) throws Exception { Properties properties = new Properties(); // 設置config.ini文件路徑 String configFilePath = "config.ini"; // 讀取配置文件 FileInputStream input = new FileInputStream(configFilePath); properties.load(input); input.close(); // 從配置文件中獲取AK、SK、Token String accessKeyId = properties.getProperty("alibaba_cloud_access_key_id"); String accessKeySecret = properties.getProperty("alibaba_cloud_access_key_secret"); String securityToken = properties.getProperty("alibaba_cloud_security_token"); CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, securityToken); // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式四:使用RAMRoleARN
如果您的應用程序需要授權訪問OSS,例如跨阿里云賬號訪問OSS,您可以使用RAMRoleARN初始化憑證提供者。該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具會前往STS服務獲取STS Token,并在會話到期前自動刷新STS Token。此外,您還可以通過為policy
賦值來限制RAM角色到一個更小的權限集合。需要注意的是,該方式需要您提供一個AK或STS Token,存在安全性風險和維護復雜度增加的風險。如何獲取AK或STS Token,請參見CreateAccessKey - 為RAM用戶創建訪問密鑰或AssumeRole - 獲取扮演角色的臨時身份憑證。如何獲取RAMRoleARN,請參見CreateRole - 創建角色。
AK和RAMRoleARN
添加credentials依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
配置AK和RAMRoleARN作為訪問憑證。
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; public class RamRoleArnAkDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 訪問憑證類型。固定為ram_role_arn config.setType("ram_role_arn"); // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn config.setRoleArn("<RoleArn>"); // 從環境變量中獲取AccessKeyId config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID")); // 從環境變量中獲取AccessKeySecret config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName config.setRoleName("<RoleSessionName>"); // 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // 設置角色會話有效期,非必填 config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 使用credentialsProvider初始化客戶端并進行后續操作... } }
STS Token和RAMRoleARN
添加credentials依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
配置STS Token和RAMRoleARN作為訪問憑證。
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; public class RamRoleArnStsDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 訪問憑證類型。固定為ram_role_arn config.setType("ram_role_arn"); // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn config.setRoleArn("<RoleArn>"); // 從環境變量中獲取臨時身份憑證,并注入到config中 config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID")); config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); config.setSecurityToken(System.getenv().get("ALIBABA_CLOUD_SECURITY_TOKEN")); // 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName config.setRoleName("<RoleSessionName>"); // 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // 設置角色會話有效期,非必填 config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式五:使用ECSRAMRole
如果您的應用程序運行在ECS實例、ECI實例、容器服務Kubernetes版的Worker節點中,建議您使用ECSRAMRole初始化憑證提供者。該方式底層實現是STS Token。ECSRAMRole允許您將一個角色關聯到ECS實例、ECI實例或容器服務 Kubernetes 版的Worker節點,實現在實例內部自動刷新STS Token。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。如何獲取ECSRAMRole,請參見CreateRole - 創建角色。如何將一個角色關聯到ECS實例,請參見通過ECS實例RAM角色授權ECS訪問其他云服務。
添加credentials依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
配置ECSRAMRole作為訪問憑證。
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; public class EcsRamRoleDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 訪問憑證類型。固定為ecs_ram_role。 config.setType("ecs_ram_role"); // 為ECS授予的RAM角色的名稱。可選參數。如果不設置,將自動檢索。強烈建議設置,以減少請求。 config.setRoleName("<RoleName>"); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式六:使用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。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。詳情請參見通過RRSA配置ServiceAccount的RAM權限實現Pod權限隔離。
添加credentials依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
配置OIDC的RAM角色作為訪問憑證。
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; public class OidcRoleArnDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 指定Credential類型,固定值為oidc_role_arn config.setType("oidc_role_arn"); // RAM角色名稱ARN,可以通過環境變量ALIBABA_CLOUD_ROLE_ARN設置RoleArn config.setRoleArn("<RoleArn>"); // OIDC提供商ARN,可以通過環境變量ALIBABA_CLOUD_OIDC_PROVIDER_ARN設置OidcProviderArn config.setOidcProviderArn("<OidcProviderArn>"); // OIDC Token文件路徑,可以通過環境變量ALIBABA_CLOUD_OIDC_TOKEN_FILE設置OidcTokenFilePath config.setOidcTokenFilePath("<OidcTokenFilePath>"); // 角色會話名稱,可以通過環境變量ALIBABA_CLOUD_ROLE_SESSION_NAME設置RoleSessionName config.setRoleSessionName("<RoleSessionName>"); // 設置更小的權限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // 設置session過期時間 config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式七:使用函數計算上下文中的Credentials
如果您的應用程序的函數部署運行在函數計算中,您可以使用函數計算上下文中的Credentials初始化憑證提供者。該方式底層實現是STS Token。函數計算根據函數配置的角色,通過扮演服務角色,而獲取一個STS Token,然后通過上下文中的參數Credentials將STS Token傳遞給您的應用程序。該STS Token的有效期為36小時,且不支持修改。函數的最大執行時間為24小時,因此,執行函數過程中,STS Token不會過期,您無需考慮刷新問題。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。如何授予函數計算訪問OSS的權限,請參見授予函數計算訪問其他云服務的權限。
添加函數計算上下文依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core --> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.4.1</version> </dependency>
使用函數計算上下文中的Credentials初始化憑證提供者。
package example; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.Credentials; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider; public class App implements StreamRequestHandler { @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { // 獲取密鑰信息,執行前,確保函數所在的服務配置了角色信息,并且角色需要擁有相關OSS權限,建議直接使用AliyunFCDefaultRole角色 Credentials creds = context.getExecutionCredentials(); // 使用獲取到的憑證創建憑證提供者實例 CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken()); // 使用credentialsProvider初始化客戶端并進行后續操作... outputStream.write(new String("done").getBytes()); } }
方式八:使用CredentialsURI
如果您的應用程序需要通過外部系統獲取阿里云憑證,從而實現靈活的憑證管理和無密鑰訪問,您可以使用CredentialsURI初始化憑證提供者。該方式底層實現是STS Token。Credentials工具通過您提供的URI獲取STS Token,完成憑證客戶端初始化。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。需要注意的是,提供CredentialsURI響應的后端服務需要實現STS Token的自動刷新邏輯,確保您的應用程序始終能獲取到有效憑證。
為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:
響應狀態碼:200
響應體結構:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
添加credentials依賴。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
配置CredentialsURI作為訪問憑證。
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; public class CredentialsUriDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // 訪問憑證類型。固定為credentials_uri config.setType("credentials_uri"); // 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變量ALIBABA_CLOUD_CREDENTIALS_URI設置CredentialsUri config.setCredentialsUri("<CredentialsUri>"); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // 使用credentialsProvider初始化客戶端并進行后續操作... } }
方式九:自定義訪問憑證
如果以上憑證配置方式都不滿足要求時,您還可以通過實現Credential Providers接口的方式,來自定義憑證提供方式。需要注意,如果底層實現是STS Token,需要提供憑證的更新支持。
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;
public class CustomCredentialProviderDemoTest {
public static void main(String[] args) {
CredentialsProvider credentialsProvider = new CredentialsProvider(){
// 初始化變量
String accessKeyId = null;
// 初始化變量
String accessKeySecrect = null;
// 初始化變量
// String token = null;
@Override
public void setCredentials(Credentials credentials) {
}
@Override
public Credentials getCredentials() {
//TODO
//自定義訪問憑證的獲取方法
// 返回長期憑證 access_key_id, access_key_secrect
return new DefaultCredentials(accessKeyId, accessKeySecrect);
// 返回 臨時憑證 access_key_id, access_key_secrect, token
// 對于臨時憑證,需要根據過期時間,刷新憑證。
// return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
}
};
// 使用credentialsProvider初始化客戶端并進行后續操作...
}
}
后續步驟
初始化憑證提供者后,您需要使用憑證提供者來創建OSSClient實例。詳情請參見初始化。