
# 获取Spark作业委托临时凭证用于访问其他云服务
#### 功能描述
DLI提供了一个通用接口，可用于获取用户在启动Spark作业时设置的委托的临时凭证。该接口将获取到的该作业委托的临时凭证封装到com.huaweicloud.sdk.core.auth.BasicCredentials类中。
- 获取到的委托的临时认证封装到com.huaweicloud.sdk.core.auth.ICredentialProvider接口的getCredentials()返回值中。
- 返回类型为com.huaweicloud.sdk.core.auth.BasicCredentials。
- 仅支持获取AK、SK、SecurityToken。
- 获取到AK、SK、SecurityToken后，请参考[如何使用凭据管理服务替换硬编码的数据库账号密码](https://support.huaweicloud.com/bestpractice-dew/dew_06_0014.html)查询凭据。
 
#### 约束限制
- 仅支持Spark3.3.1版本（Spark通用队列场景）使用委托授权访问临时凭证：
  - 在创建作业时，请配置作业使用Spark3.3.1版本
  
  - 已在作业中配置允许DLI访问DEW的委托信息。spark.dli.job.agency.name=*自定义委托名称* 。
    自定义委托请参考[自定义DLI委托权限](https://support.huaweicloud.com/usermanual-dli/dli_01_0616.html)。
    请注意配置参数不需要用"" 或 '' 包裹。
    
   
- Spark3.3.1基础镜像内置了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 org.apache.spark.sql.SparkSession;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import com.huaweicloud.sdk.core.auth.BasicCredentials;
  import com.huaweicloud.sdk.core.auth.ICredentialProvider;
  import static com.huawei.dli.demo.DLIJobAgencyCredentialUtils.getICredentialProvider;
  public class GetUserCredentialsSparkJar {
  private static final Logger LOG = LoggerFactory.getLogger(GetUserCredentialsSparkJar.class);
  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();
    spark.stop();
   }
  }
  ```
  

- **获取作业委托的工具类**
  ```
  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 DLIJobAgencyCredentialUtils {
  public static ICredentialProvider getICredentialProvider() {
           List<ICredentialProvider> credentialProviders = new ArrayList<>();
           ServiceLoader.load(ICredentialProvider.class, SparkSession.class.getClassLoader())
                         .iterator()
                         .forEachRemaining(credentialProviders::add);
           if (credentialProviders.size() != 1) {
              throw new RuntimeException("Failed to obtain temporary user credential");
           }
           return credentialProviders.get(0);
      }
  }
  ```
  
 
