# 认证鉴权
调用接口仅支持一种认证鉴权方式。
- AK/SK认证：通过AK（Access Key ID）/SK（Secret Access Key)加密调用请求。
 #### AK/SK认证
![](https://support.huaweicloud.com/api-agentidentity/public_sys-resources/note_3.0-zh-cn.png)
AK/SK既可以使用永久访问密钥中的AK/SK，也可以使用临时访问密钥中的AK/SK，区别是临时访问密钥需要额外携带"X-Security-Token"Http Header头。
AK/SK签名认证方式仅支持消息体大小12M以内。
AK/SK认证就是使用AK/SK对请求进行签名，在请求时将签名信息添加到消息头，从而通过身份认证。
- AK（Access Key ID）：访问密钥ID。与私有访问密钥关联的唯一标识符；访问密钥ID和私有访问密钥一起使用，对请求进行加密签名。
- SK（Secret Access Key）：与访问密钥ID结合使用的密钥，对请求进行加密签名，可标识发送方，并防止请求被修改。
使用AK/SK认证时，您可以基于签名算法使用AK/SK对请求进行签名，也可以使用专门的签名SDK对请求进行签名。详细的签名方法和SDK使用方法请参见：[API签名指南](https://support.huaweicloud.com/devg-apisign/api-sign-provide.html)。
![](https://support.huaweicloud.com/api-agentidentity/public_sys-resources/note_3.0-zh-cn.png)
签名SDK只提供签名功能，与服务提供的SDK不同，使用时请注意。
| [Java签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-java.html) |       [Go签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-go.html)       |  [Python签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-python.html)   |
|---|---|---|
| [C#签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-csharp.html)  | [JavaScript签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-nodejs.html) | [PHP签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-php.html)           |
| [C++签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-cplus.html)  | [C签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-c.html)              | [Android签名指导](https://support.huaweicloud.com/devg-apisign/api-sign-sdk-android.html) |
   
如果上述提供的签名SDK中没有你需要的开发语言，您可以基于[API的签名认证机制](https://support.huaweicloud.com/devg-apisign/api-sign-algorithm-001.html)，自己实现请求的签名。
**签名示例**
以下结合一个[Java Demo](https://obs.cn-north-1.myhuaweicloud.com/apig-sdk/ApiGateway-java-sdk.zip)来介绍如何对一个请求进行签名，并通过HTTP Client发送一个HTTPS请求的过程。如果您不使用Demo工程，也可以直接下载API网关签名工具在其他工程中引用。
1. 生成AK/SK。如果已生成过AK/SK，则可跳过此步骤，找到原来已下载的AK/SK文件，文件名一般为：credentials.csv。
   1. 登录[管理控制台](https://console.huaweicloud.com/)，鼠标移动至右上方的用户名，在下拉列表中选择"我的凭证"。
   
   2. 在左侧导航栏单击"访问密钥"，然后在页面中单击"新增访问密钥"。
   
   3. 在"新增访问密钥"弹窗的最下方，勾选理解上述建议的选项，然后单击"下一步"。
   
   4. 单击"确定"，访问密钥创建成功。
      - 在为账号用户创建访问密钥时，还需要进行身份验证，输入对应的验证码。
      
      - 如果开启了操作保护，在为IAM用户创建访问密钥时，也需要进行身份验证，输入对应的验证码。
       
   
   5. 单击"立即下载"，把访问密钥下载到本地。
   
   
   ![](https://support.huaweicloud.com/api-agentidentity/public_sys-resources/note_3.0-zh-cn.png)
   为防止访问密钥泄露，建议您将其保存到安全的位置。
   
2. 把AK/SK设置为环境变量。 本示例以Linux系统的操作为例，在本地环境将[1]中获取的AK/SK设置为环境变量
   1. 打开终端，执行以下命令编辑环境变量配置文件。
      ```
      vi ~/.bashrc
      ```
      
   
   2. 在文件中添加如下环境变量配置，然后保存文件并退出编辑器。
      ```
      export HUAWEICLOUD_SDK_AK="已获取的AK值"  
      export HUAWEICLOUD_SDK_SK="已获取的SK值"
      ```
      
   
   3. 执行以下命令使配置文件生效。
      ```
      source ~/.bashrc
      ```
      
    
3. 获取示例代码，并解压缩。
4. 打开IDEA，在菜单栏选择"File \> New \> Project from Existing Sources"。 选择解压后的"ApiGateway-java-sdk-*x.x.x*"文件夹，单击"OK"，导入示例工程。
   
5. 在"Import Project"页面，选择"Import project from external model"。 选择"Maven"，最后单击"Create"。
   ![](https://support.huaweicloud.com/api-agentidentity/zh-cn_image_0000002689817324.png)
   
6. IDEA支持在当前窗口或新窗口创建工程。此处，在弹窗中单击"New Window"。
7. 配置maven的settings.xml。
   1. 在profiles节点中添加如下内容：
      ```
      <profile> 
           <id>MyProfile</id> 
           <repositories> 
               <repository> 
                   <id>HuaweiCloudSDK</id> 
                   <url>https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/</url> 
                   <releases> 
                       <enabled>true</enabled> 
                   </releases> 
                   <snapshots> 
                       <enabled>false</enabled> 
                   </snapshots> 
               </repository> 
           </repositories> 
           <pluginRepositories> 
               <pluginRepository> 
                   <id>HuaweiCloudSDK</id> 
                   <url>https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/</url> 
                   <releases> 
                       <enabled>true</enabled> 
                   </releases> 
                   <snapshots> 
                       <enabled>false</enabled> 
                   </snapshots> 
               </pluginRepository> 
           </pluginRepositories> 
       </profile>
      ```
      
   
   2. 在mirrors节点中增加：
      ```
      <mirror> 
           <id>huaweicloud</id> 
           <mirrorOf>*,!HuaweiCloudSDK</mirrorOf> 
           <url>https://repo.huaweicloud.com/repository/maven/</url> 
       </mirror>
      ```
      
   
   3. 增加activeProfiles标签激活配置：
      ```
      <activeProfiles> 
           <activeProfile>MyProfile</activeProfile> 
       </activeProfiles>
      ```
      
    
8. 下载Maven依赖，选择"pom.xml"并右键选择"Maven \> Reload project"。 ![](https://support.huaweicloud.com/api-agentidentity/zh-cn_image_0000002719656869.png)
   
9. 打开Eclipse，在菜单栏选择"File \> Import"，弹出"Import"对话框，选择"General \> Existing Projects into Workspace"，选择解压后的"APIGW-java-sdk-*x.x.x* "文件夹。
   ![](https://support.huaweicloud.com/api-agentidentity/zh-cn_image_0000002719696763.png)
   
10. 单击"Finish"，完成导入。导入后的示例工程如下所示。 ![](https://support.huaweicloud.com/api-agentidentity/zh-cn_image_0000002719760799.png)
    
11. 修改HttpClientDemo.java文件，把API信息和已设置的环境变量替换到对应位置。 如下示例所示，加粗部分内容需要替换成实际值。
    ```
    public class HttpClientDemo { 
         private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientDemo.class); 
         public static void main(String[] args) throws Exception { 
             // Create a new request. 
             Request httpClientRequest = new Request(); 
             try { 
                 // HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK需替换为前面步骤中设置的环境变量值
                 httpClientRequest.setKey(System.getenv("HUAWEICLOUD_SDK_AK")); 
                 httpClientRequest.setSecret(System.getenv("HUAWEICLOUD_SDK_SK")); 
                 // 设置API的请求方法
                 httpClientRequest.setMethod("POST"); 
                 // 设置API的请求路径，格式为https://{Endpoint}/{URI} 
                 httpClientRequest.setUrl("put your request url here"); 
                 httpClientRequest.addHeader("Content-Type", "text/plain"); 
                 // 设置API的请求Body体
                 httpClientRequest.setBody("put your request body here"); 
             } catch (Exception e) { 
                 LOGGER.error(e.getMessage()); 
                 return; 
             } 
             CloseableHttpClient client = null; 
             try { 
                 // 对请求进行签名
                 HttpRequestBase signedRequest = Client.sign(httpClientRequest, Constant.SIGNATURE_ALGORITHM_SDK_HMAC_SHA256); 
                 if (Constant.DO_VERIFY) { 
                     // 创建httpClient并验证SSL证书
                     HostName.setUrlHostName(httpClientRequest.getHost()); 
                     client = (CloseableHttpClient) SSLCipherSuiteUtil.createHttpClientWithVerify(Constant.INTERNATIONAL_PROTOCOL); 
                 } else { 
                     // 创建httpClient但不验证SSL证书
                     client = (CloseableHttpClient) SSLCipherSuiteUtil.createHttpClient(Constant.INTERNATIONAL_PROTOCOL); 
                 } 
                 HttpResponse response = client.execute(signedRequest); 
                 // 打印响应Body体信息
                 HttpEntity resEntity = response.getEntity(); 
                 if (resEntity != null) { 
                     String responseBody = EntityUtils.toString(resEntity, StandardCharsets.UTF_8); 
                     LOGGER.info("HTTP response body: {}", responseBody); 
                 } 
             } catch (Exception e) { 
                 LOGGER.error(e.getMessage()); 
             } finally { 
                 if (client != null) { 
                     client.close(); 
                 } 
             } 
         } 
     }
    ```
    
12. 运行HttpClientDemo.java，对请求进行签名、访问API并打印结果。 显示**{"200": "sdk success"}**，表示签名成功，API请求成功发送到后端。
    如果改变AK或SK的值，API网关将返回的错误信息error_msg。
    您也可以通过这个视频教程了解AK/SK认证的使用：<https://bbs.huaweicloud.com/videos/100697>。
    
 
