更新时间:2025-11-12 gmt 08:00

认证鉴权-j9九游会登录

调用接口有如下两种认证方式,您可以选择其中一种进行认证鉴权。

  • ak/sk认证:通过ak(access key id)/sk(secret access key)加密调用请求。
  • token认证:通过token认证调用请求。

ak/sk认证

ak/sk认证就是使用ak/sk对请求进行签名,在请求时将签名信息添加到消息头,从而通过身份认证。

  • ak(access key id):访问密钥id。与私有访问密钥关联的唯一标识符;访问密钥id和私有访问密钥一起使用,对请求进行加密签名。
  • sk(secret access key):与访问密钥id结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。
  • ak/sk签名认证方式仅支持消息体大小12mb以内,12mb以上的请求请使用token认证。
  • api网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差大于15分钟,api网关将拒绝请求。因此客户端必须注意本地时间与时钟服务器的同步,避免请求消息头x-sdk-date的值出现较大误差。

以下结合一个来介绍如何对一个请求进行签名,并通过http client发送一个https请求的过程。如果您不使用demo工程,也可以直接下载api网关签名工具在其他工程中引用。

  1. 生成ak/sk。如果已生成过ak/sk,则可跳过此步骤,找到原来已下载的ak/sk文件,文件名一般为:credentials.csv。
    1. 登录manageone运营面。
    2. 在页面右上角单击用户图标,在下拉列表中选择“个人设置”。
    3. 在“个人设置”页面选择“管理访问密钥”页签。
    4. 单击“新增访问密钥”,新建ak/sk。
    5. 单击“确定”,自动下载访问密钥文件。
    6. 下载成功后,在credentials.csv文件中获取ak和sk信息。
      • 每个用户仅允许新增两个访问密钥。
      • 为保证访问密钥的安全,访问密钥仅在初次生成时自动下载,后续不可再次通过管理控制台界面获取。请在生成后妥善保管。
  2. 获取示例代码,解压缩。
  3. 打开idea,在菜单栏选择“file > new > project from existing sources”。

    选择解压后的“apigateway-java-sdk-x.x.x”文件夹,单击“ok”,导入示例工程。

  4. 在“import project”页面,选择“import project from external model”。

    选择“maven”,然后单击“create”。

  5. idea支持在当前窗口或新窗口创建工程。此处,在弹窗中单击“new window”。
  6. 修改httpclientdemo.java中的api请求信息。
    1. 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。以linux系统为例在本地将1中获取的ak/sk设置为环境变量。
      1. 打开终端,执行以下命令打开环境变量配置文件。
        vi ~/.bashrc
      2. 在文件中添加如下环境变量配置,保存文件并退出编辑器。
        export huaweicloud_sdk_ak="已获取的ak值" 
        export huaweicloud_sdk_sk="已获取的sk值" 
      3. 执行以下命令使配置文件生效。
        source ~/.bashrc
    2. 把api信息和已设置的环境变量替换到httpclientdemo.java中的对应位置。
      如下示例所示,加粗部分信息需要替换成实际值。
      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 {
                  // set the request parameters.
                  // appkey, appsecrect, method and url are required parameters.
                  // directly writing ak/sk in code is risky. for security, encrypt your ak/sk and store them in the configuration file or environment variables.
                  // in this example, the ak/sk are stored in environment variables for identity authentication. 
                  // before running this example, set environment variables huaweicloud_sdk_ak and huaweicloud_sdk_sk.
                  httpclientrequest.setkey(system.getenv("huaweicloud_sdk_ak"));
                  httpclientrequest.setsecret(system.getenv("huaweicloud_sdk_sk"));
                  // set a request method for http request.
                  httpclientrequest.setmethod("post");
                  // set a request url in the format of https://{endpoint}/{uri}.
                  httpclientrequest.set;
                  httpclientrequest.addheader("content-type", "text/plain");
                  // set a body for http request.
                  httpclientrequest.setbody("put your request body here");
              } catch (exception e) {
                  logger.error(e.getmessage());
                  return;
              }
              closeablehttpclient client = null;
              try {
                  // sign the request.
                  httprequestbase signedrequest = client.sign(httpclientrequest, constant.signature_algorithm_sdk_hmac_sha256);
                  if (constant.do_verify) {
                      // create httpclient and verify ssl certificate
                      hostname.seturlhostname(httpclientrequest.gethost());
                      client = (closeablehttpclient) sslciphersuiteutil.createhttpclientwithverify(constant.international_protocol);
                  } else {
                      // create httpclient and do not verify ssl certificate
                      client = (closeablehttpclient) sslciphersuiteutil.createhttpclient(constant.international_protocol);
                  }
                  httpresponse response = client.execute(signedrequest);
                  // print the body of the response.
                  httpentity resentity = response.getentity();
                  if (resentity != null) {
                      logger.info("processing body with name: {} and value: {}", system.getproperty("line.separator"),
                              entityutils.tostring(resentity, "utf-8"));
                  }
              } catch (exception e) {
                  logger.error(e.getmessage());
              } finally {
                  if (client != null) {
                      client.close();
                  }
              }
          }
      }
  7. 运行httpclientdemo.java,对请求进行签名、访问api并打印结果。

    如果改变ak或sk的值,api网关将返回的错误信息error_msg。

token认证

token的有效期为24小时,需要使用一个token鉴权时,可以先缓存起来,避免频繁调用。

token在计算机系统中代表令牌(临时)的意思,拥有token就代表拥有某种权限。token认证就是在调用api的时候将token加到请求消息头,从而通过身份认证,获得操作api的权限。token可通过调用获取用户token接口获取。

云服务存在两种部署方式:项目级服务和全局级服务。

  • 项目级服务需要获取项目级别的token,此时请求body中auth.scope的取值为project。
  • 全局级服务需要获取全局级别的token,此时请求body中auth.scope的取值为domain。

调用本服务api需要项目级别的token,即调用获取用户token接口时,请求body中auth.scope的取值需要选择project,如下所示。

{ 
     "auth": { 
         "identity": { 
             "methods": [ 
                 "password" 
             ], 
             "password": { 
                 "user": { 
                     "name": "username", 
                     "password": "********", 
                     "domain": { 
                         "name": "domainname" 
                     } 
                 } 
             } 
         }, 
         "scope": { 
             "project": { 
                 "name": "projectname" 
             } 
         } 
     } 
 }

在中以调用获取用户token的接口为例说明了如何调用api。获取token后,再调用其他接口时,您需要在请求消息头中添加“x-auth-token”,其值即为token。例如token值为“abcdefj....”,则调用接口时将“x-auth-token: abcdefj....”加到请求消息头即可,如下所示。

post https://iam.cn-north-1.myhuaweicloud.com/v3/auth/projects 
content-type: application/json 
x-auth-token: abcdefj....

相关文档

网站地图