# 获取Spark作业委托临时凭证用于访问其他云服务
#### 功能描述
AI DataLake Spark提供了一个通用接口，可用于获取用户在启动Spark作业时设置的委托的临时凭证。该接口将获取到的作业委托的临时凭证封装到com.huaweicloud.sdk.core.auth.BasicCredentials类中。
- 获取到的委托的临时认证封装到com.huawei.spark.provider.DewProvider接口的getCredentials()返回值中。
- 返回类型为com.huaweicloud.sdk.core.auth.BasicCredentials。
- 仅支持获取AK、SK、SecurityToken。
- 获取到AK、SK、SecurityToken后，请参考[如何使用凭据管理服务替换硬编码的数据库账号密码](https://support.huaweicloud.com/bestpractice-dew/dew_06_0014.html)查询凭据。
 
#### 约束限制
- 仅支持Spark 4.0版本（Spark通用队列场景）使用委托授权访问临时凭证：
  - 在创建作业时，请配置作业使用Spark4.0版本。
  
  - 已在作业中配置允许访问DEW的委托信息。 自定义委托请参考[创建自定义委托](https://support.huaweicloud.com/usermanual-aidatalake/aidatalake_01_0078.html)。
    请注意配置参数不需要用"" 或 '' 包裹。
    
   
- Spark4.0基础镜像内置了3.1.62版本的huaweicloud-sdk-core，无需重复安装。
 
#### 准备环境
已安装和配置IntelliJ IDEA、JDK和Maven。
pom文件配置中依赖包：
```
<dependency>
    <groupId>com.huaweicloud.sdk</groupId>
    <artifactId>huaweicloud-sdk-core</artifactId>
    <version>3.1.62</version>
    <scope>provided</scope>
</dependency>
```
#### 代码示例
本章节JAVA代码示例演示如何获取BasicCredentials，以及获取临时委托的AK、SK、SecurityToken。
- Spark Jar作业获取作业委托凭证
  ```
  import com.huaweicloud.sdk.core.auth.ICredentialProvider;
  import org.apache.spark.sql.SparkSession;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.ServiceLoader;
  public class JobAgencyCredentialUtils {
      // 通过SPI加载所有凭证提供者，筛选出DEW服务的DewProvider实例。
      public static ICredentialProvider getICredentialProvider() {
          List<ICredentialProvider> credentialProviders = new ArrayList<>();
          ServiceLoader.load(ICredentialProvider.class, SparkSession.class.getClassLoader())
                  .iterator()
                  .forEachRemaining(credentialProviders::add);
          if (credentialProviders.isEmpty()) {
              throw new RuntimeException("No ICredentialProvider found");
          }
          return credentialProviders.stream()
                  .filter(p -> p.getClass().getName().equals("com.huawei.spark.provider.DewProvider"))
                  .findFirst()
                  .orElseThrow(() -> new RuntimeException("DewProvider not found"));
      }
  }
  ```
  
- 获取作业委托的工具类
  ```
  import org.apache.spark.sql.SparkSession;
  import com.huaweicloud.sdk.core.auth.BasicCredentials;
  import com.huaweicloud.sdk.core.auth.ICredentialProvider;
  import static org.example.JobAgencyCredentialUtils.getICredentialProvider;
  public class GetUserCredentialsSparkJar {
      public static void main(String[] args) throws Exception {
          SparkSession spark = SparkSession
                  .builder()
                  .appName("test_spark")
                  .getOrCreate();
          ICredentialProvider credentialProvider = getICredentialProvider();
          BasicCredentials basicCredentials = (BasicCredentials) credentialProvider.getCredentials();
          String ak = basicCredentials.getAk();
          String sk = basicCredentials.getSk();
          String securityToken = basicCredentials.getSecurityToken();
          //
          System.out.println("ak:" + ak);
          System.out.println("sk:" + sk);
          System.out.println("securityToken:" + securityToken);
          spark.stop();
      }
  }
  ```
  
 
