更新时间:2025-03-04 gmt 08:00

通过app认证的方式访问在线服务-九游平台

部署在线九游平台的服务支持开启app认证,即modelarts会为服务注册一个支持app认证的接口,为此接口配置app授权后,用户可以使用授权应用的appkey appsecret或appcode调用该接口。

针对在线服务的app认证,具体操作流程如下。

  1. 开启支持app认证功能:开启支持app认证功能,选择已有app应用或者创建新的app应用。
  2. 在线服务授权管理:对创建的app应用进行管理,包括查看、重置或删除应用,绑定或解绑应用对应的在线服务,获取“appkey/appsecret”“appcode”
  3. app认证鉴权:调用支持app认证的接口需要进行认证鉴权,支持两种鉴权方式(appkey appsecret或appcode),您可以选择其中一种进行认证鉴权。
  4. 发送预测请求:

约束限制

调用api访问在线服务时,对预测请求体大小和预测时间有限制:
  • 请求体的大小不超过12mb,超过后请求会被拦截。
  • 因apig(api网关)限制,平台每次请求预测的时间不超过40秒。

前提条件

  • 数据已完成准备:已在modelarts中创建状态“正常”可用的模型。
  • 由于在线运行需消耗资源,确保账户未欠费。
  • 已获取预测文件的本地路径,可使用绝对路径(如windows格式"d:/test.png",linux格式"/opt/data/test.png")或相对路径(如"./test.png")。

开启支持app认证功能

在部署为在线服务时,您可以开启支持app认证功能。或者针对已部署完成的在线服务,您可以修改服务,开启支持app认证功能。

  1. 登录modelarts管理控制台,在左侧菜单栏中选择“模型部署 > 在线服务”,进入在线服务管理页面。
  2. 开启支持app认证功能。
    • 在部署为在线服务时,即“部署”页面,填写部署服务相关参数时,开启支持app认证功能。
    • 针对已部署完成的在线服务,进入在线服务管理页面,单击目标服务名称“操作”列的“修改”按钮,进入修改服务页面开启支持app认证功能。
      图1 部署页面开启支持app认证功能
  3. 选择app授权配置。从下拉列表中选择您需要配置的app应用,如果没有可选项,您可以通过如下方式创建应用。
    • 单击右侧“创建应用”,填写应用名称和描述之后单击“确定”完成创建。其中应用名称默认以“app_”开头,您也可以自行修改。
    • 进入“模型部署 > 在线服务”页面,单击“授权管理”,进入“在线服务授权管理”页面,选择“创建应用”,详情请参见在线服务授权管理
  4. 开启支持app认证功能后,将支持app认证的服务授权给应用,用户可以使用创建的“appkey/appsecret”“appcode”调用服务的支持app认证的接口。

    app认证的服务授权给应用后,需要1-2分钟生效。

在线服务授权管理

如果您需要使用支持app认证功能,建议您在部署在线服务之前进行授权管理操作完成应用创建。进入“模型部署 > 在线服务”页面,单击“授权管理”,进入“在线服务授权管理”对话框。在此页面您可以实现应用的创建和管理,包括查询明文、重置或删除应用,解绑应用对应的在线服务,获取“appkey/appsecret”“appcode”

图2 在线服务授权管理
  • 创建应用

    选择“创建应用”,填写应用名称和描述之后单击“确定”完成创建。其中应用名称默认以“app_”开头,您也可以自行修改。

  • 查看、重置或删除应用

    您可以单击目标应用名称操作列的按钮完成应用的查询明文、重置或删除。创建完成后自动生成“appkey/appsecret”以供您后续调取接口进行app鉴权使用。

    图3 查询明文、重置或删除
  • 解绑服务

    您可以单击目标应用名称前方的,在下拉列表中展示绑定的服务列表,即该应用对应的在线服务列表。单击操作列的“解绑”取消绑定,将不再支持调用该接口。

  • 获取appkey/appsecret或appcode

    调用接口需要进行app鉴权,在创建app应用时自动生成“appkey/appsecret”,您可以在“在线服务授权管理”对话框中单击app应用操作列的查看完整的appsecret。单击应用名称前方的展开下拉列表,通过单击“添加appcode”自动生成“appcode”,您可以单击操作列的查看完整的appcode

    图4 添加appcode

app认证鉴权

当支持app认证功能的在线服务运行成功处于“运行中”状态,就可以对服务进行调用 。在调用之前您需要进行app认证鉴权。

当使用app认证,且开启了简易认证模式,api请求既可以选择使用appkey和appsecret做签名和校验,也可以选择使用appcode进行简易认证(modelarts默认启用简易认证)。推荐使用appkey/appsecret认证,其安全性比appcode认证要高。

  • appkey/appsecret认证:通过appkey与appsecret对请求进行加密签名,可标识发送方并防止请求被修改。使用appkey/appsecret认证时,您需要使用专门的签名sdk对请求进行签名。
    • appkey:app访问密钥id。与私有访问密钥关联的唯一标识符;访问密钥id和私有访问密钥一起使用,对请求进行加密签名。
    • appsecret:app私有访问密钥,即与访问密钥id结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。

    appkey进行简易认证时,即在调用api的时候,在http请求头部消息增加一个参数“apikey”(参数值为“appkey”),实现快速认证。

  • appcode认证:通过appcode认证通用请求。

    appcode认证就是在调用api的时候,在http请求头部消息增加一个参数“x-apig-appcode”(参数值为“appcode”),而不需要对请求内容签名,api网关也仅校验appcode,不校验请求签名,从而实现快速响应。

您可以在服务详情页的“调用指南”页签(如图5)获取api接口公网地址(对应下文示例中的在线服务的调用地址url)和appkey/appsecret(对应下文示例中的app_key、app_secret)和appcode(对应下文示例中的app_code)。请注意使用图中第二行用于app认证方式的api接口公网地址。

以下情况下需要对api接口公网地址进行拼接修改:

  • 当模型配置文件中apis定义了路径,调用地址后需拼接自定义路径。如:“{在线服务的调用地址}/predictions/poetry”。

    如果是部署sd webui推理服务,调用地址后需添加"/"。如:“https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42/”。

图5 获取app认证鉴权相关信息

方式一:使用python语言通过appkey appsecret认证鉴权方式发送预测请求

  1. 下载python sdk并在开发工具中完成sdk配置。具体操作请参见在python环境中集成api请求签名的sdk
  2. 创建请求体,进行预测请求。
    • 输入为文件格式
      # coding=utf-8
      import requests
      import os
      from apig_sdk import signer
      if __name__ == '__main__':
          # config url, ak, sk and file path.
          # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42",对应图5中的在线服务的调用地址url
          url = "在线服务的调用地址"
          # 认证用的app_key和app_secret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
          # 本示例以app_key和app_secret保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_key和huaweicloud_app_secret。
          app_key = os.environ["huaweicloud_app_key"]
          app_secret= os.environ["huaweicloud_app_secret"]
          file_path = "预测文件的本地路径"
          # create request, set method, url, headers and body.
          method = 'post'
          headers = {"x-sdk-content-sha256": "unsigned-payload"}
          request = signer.httprequest(method, url, headers)
          # create sign, set the ak/sk to sign and authenticate the request.
          sig = signer.signer()
          sig.key = app_key
          sig.secret = app_secret
          sig.sign(request)
          # send request
          files = {'images': open(file_path, 'rb')}
          resp = requests.request(request.method, request.scheme   "://"   request.host   request.uri, headers=request.headers, files=files)
          # print result
          print(resp.status_code)
          print(resp.text)
      “files”参数的请求体样式为“files={"请求参数":("文件路径",文件内容,“文件类型”)}”,参数填写可以参考表1
      表1 files参数说明

      参数

      是否必填

      说明

      请求参数

      在线服务输入参数名称。

      文件路径

      上传文件的路径。

      文件内容

      上传文件的内容。

      文件类型

      上传文件类型。当前支持以下类型:

      • txt类型:text/plain
      • jpg/jpeg类型:image/jpeg
      • png类型:image/png
    • 输入为文本格式(json类型)

      读取本地预测文件并进行base64编码的请求体示例如下:

      # coding=utf-8
      import base64
      import json
      import os
      import requests
      from apig_sdk import signer
      if __name__ == '__main__':
          # config url, ak, sk and file path.
          # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42"
          url = "在线服务的调用地址"
          # 认证用的app_key和app_secret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
          # 本示例以app_key和app_secret保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_key和huaweicloud_app_secret。
          app_key = os.environ["huaweicloud_app_key"]
          app_secret= os.environ["huaweicloud_app_secret"]
          file_path = "预测文件的本地路径"
          with open(file_path, "rb") as file:
              base64_data = base64.b64encode(file.read()).decode("utf-8")
          # create request, set method, url, headers and body.
          method = 'post'
          headers = {
              'content-type': 'application/json'
          }
          body = {
              'image': base64_data
          }
          request = signer.httprequest(method, url, headers, json.dumps(body))
          # create sign, set the appkey&appsecret to sign and authenticate the request.
          sig = signer.signer()
          sig.key = app_key
          sig.secret = app_secret
          sig.sign(request)
          # send request
          resp = requests.request(request.method, request.scheme   "://"   request.host   request.uri, headers=request.headers, data=request.body)
          # print result
          print(resp.status_code)
          print(resp.text)

      “body”中的参数名由在线服务的输入参数决定,需要和“类型”“string”的输入参数“名称”保持一致。此处以“image”为例。“body”中的base64_data值为string类型。

方式二:使用java语言通过appkey appsecret认证鉴权方式发送预测请求

  1. 下载java sdk并在开发工具中完成sdk配置。具体操作请参见在java环境中集成api请求签名的sdk
  2. 创建java类,进行预测请求。

    由于在apig的java sdk中,“request.setbody()”只支持string类型,所以只支持输入为文本格式的预测请求。

    此处以json格式为例介绍读取本地预测文件并进行base64编码的请求体:

    // package name of the demo.
    package com.apig.sdk.demo;
    import com.cloud.apigateway.sdk.utils.client;
    import com.cloud.apigateway.sdk.utils.request;
    import org.apache.http.httpheaders;
    import org.apache.http.client.methods.closeablehttpresponse;
    import org.apache.http.client.methods.httppost;
    import org.apache.http.client.methods.httprequestbase;
    import org.apache.http.impl.client.httpclients;
    import org.apache.http.util.entityutils;
    public class myaksktest {
        public static void main(string[] args) {
           # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42"
            string url = "在线服务的调用地址";
           // 认证用的appkey和appsecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
           // 本示例以appkey和appsecret保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_key和huaweicloud_app_secret。 
            string appkey = system.getenv("huaweicloud_app_key");
           string appsecret = system.getenv("huaweicloud_app_secret");
            string body = "{}";
            try {
                // create request
                request request = new request();
                // set the ak/appsecret to sign and authenticate the request.
                request.setkey(appkey);
                request.setsecret(appsecret);
                // specify a request method, such as get, put, post, delete, head, and patch.
                request.setmethod(httppost.method_name);
                // add header parameters
                request.addheader(httpheaders.content_type, "application/json");
                // set a request url in the format of https://{endpoint}/{uri}.
                request.set;
                // special characters, such as the double quotation mark ("), contained in the body must be escaped.
                request.setbody(body);
                // sign the request.
                httprequestbase signedrequest = client.sign(request);
                // send request.
                closeablehttpresponse response = httpclients.createdefault().execute(signedrequest);
                // print result
                system.out.println(response.getstatusline().getstatuscode());
                system.out.println(entityutils.tostring(response.getentity()));
            } catch (exception e) {
                e.printstacktrace();
            }
        }
    }

    “body”由具体文本格式决定,此处以json为例。

方式三:使用python语言通过appcode认证鉴权方式发送预测请求

  1. 下载python sdk并在开发工具中完成sdk配置。具体操作请参见在python环境中集成api请求签名的sdk
  2. 创建请求体,进行预测请求。
    • 输入为文件格式
      # coding=utf-8
      import requests
      import os
      if __name__ == '__main__':
          # config url, app code and file path.
          # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42"
          url = "在线服务的调用地址"
          # 认证用的app_code硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
          # 本示例以app_code保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_code。
          app_code = os.environ["huaweicloud_app_code"]
          file_path = "预测文件的本地路径"
          # send request.
          headers = {
              'x-apig-appcode': app_code
          }
          files = {
              'images': open(file_path, 'rb')
          }
          resp = requests.post(url, headers=headers, files=files)
          # print result
          print(resp.status_code)
          print(resp.text)

      “files”中的参数名由在线服务的输入参数决定,需要和“类型”为“file”的输入参数“名称”保持一致。此处以“images”为例。

    • 输入为文本格式(json类型)

      读取本地预测文件并进行base64编码的请求体示例如下:

      # coding=utf-8
      import base64
      import requests
      import os
      if __name__ == '__main__':
          # config url, app code and request body.
          # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42"
          url = "在线服务的调用地址"
          # 认证用的app_code硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
          # 本示例以app_code保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_code。
          app_code = os.environ["huaweicloud_app_code"]
          file_path = "预测文件的本地路径"
          with open(file_path, "rb") as file:
              base64_data = base64.b64encode(file.read()).decode("utf-8")
          # send request
          headers = {
              'content-type': 'application/json',
              'x-apig-appcode': app_code
          }
          body = {
              'image': base64_data
          }
          resp = requests.post(url, headers=headers, json=body)
          # print result
          print(resp.status_code)
          print(resp.text)

      “body”中的参数名由在线服务的输入参数决定,需要和“类型”“string”的输入参数“名称”保持一致。此处以“image”为例。“body”中的base64_data值为string类型。

方式四:使用java语言通过appcode认证鉴权方式发送预测请求

  1. 下载java sdk并在开发工具中完成sdk配置。具体操作请参见在java环境中集成api请求签名的sdk
  2. (可选)当预测请求的输入为文件格式时,java工程依赖httpmime模块。
    1. 在工程“libs”中增加httpmime-x.x.x.jar。完整的java依赖库如图6所示。

      httpmime-x.x.x.jar建议使用4.5及以上版本,下载地址:。

      图6 java依赖库
    2. httpmime-x.x.x.jar添加完成后,在java工程的.classpath文件中,补充httpmime信息,如下所示:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
  3. 创建java类,进行预测请求。
    • 输入为文件格式
      java的请求体示例如下:
      // package name of the demo.
      package com.apig.sdk.demo;
      import org.apache.http.consts;
      import org.apache.http.httpentity;
      import org.apache.http.client.methods.closeablehttpresponse;
      import org.apache.http.client.methods.httppost;
      import org.apache.http.entity.contenttype;
      import org.apache.http.entity.mime.multipartentitybuilder;
      import org.apache.http.impl.client.httpclients;
      import org.apache.http.util.entityutils;
      import java.io.file;
      public class myappcodefile {
          public static void main(string[] args) {
             # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42"
              string url = "在线服务的调用地址";
             // 认证用的appcode硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
             // 本示例以appcode保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_code。 
              string appcode = system.getenv("huaweicloud_app_code");
              string filepath = "预测文件的本地路径";
              try {
                  // create post
                  httppost httppost = new httppost(url);
                  // add header parameters
                  httppost.setheader("x-apig-appcode", appcode);
                  // special characters, such as the double quotation mark ("), contained in the body must be escaped.
                  file file = new file(filepath);
                  httpentity entity = multipartentitybuilder.create().addbinarybody("images", file).setcontenttype(contenttype.multipart_form_data).setcharset(consts.utf_8).build();
                  httppost.setentity(entity);
                  // send post
                  closeablehttpresponse response = httpclients.createdefault().execute(httppost);
                  // print result
                  system.out.println(response.getstatusline().getstatuscode());
                  system.out.println(entityutils.tostring(response.getentity()));
              } catch (exception e) {
                  e.printstacktrace();
              }
          }
      }

      “addbinarybody”中的参数名由在线服务的输入参数决定,需要和“类型”为“file”的输入参数“名称”保持一致。此处以“images”为例。

    • 输入为文本格式(json类型)

      读取本地预测文件并进行base64编码的请求体示例如下:

      // package name of the demo.
      package com.apig.sdk.demo;
      import org.apache.http.httpheaders;
      import org.apache.http.client.methods.closeablehttpresponse;
      import org.apache.http.client.methods.httppost;
      import org.apache.http.entity.stringentity;
      import org.apache.http.impl.client.httpclients;
      import org.apache.http.util.entityutils;
      public class myappcodetest {
          public static void main(string[] args) {
             # api接口公网地址,例如"https://8e******5fe.apig.******.huaweicloudapis.com/v1/infers/f2682******f42"
              string url = "在线服务的调用地址";
             // 认证用的appcode硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
             // 本示例以appcode保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_app_code。 
              string appcode = system.getenv("huaweicloud_app_code");
              string body = "{}";
              try {
                  // create post
                  httppost httppost = new httppost(url);
                  // add header parameters
                  httppost.setheader(httpheaders.content_type, "application/json");
                  httppost.setheader("x-apig-appcode", appcode);
                  // special characters, such as the double quotation mark ("), contained in the body must be escaped.
                  httppost.setentity(new stringentity(body));
                  // send post
                  closeablehttpresponse response = httpclients.createdefault().execute(httppost);
                  // print result
                  system.out.println(response.getstatusline().getstatuscode());
                  system.out.println(entityutils.tostring(response.getentity()));
              } catch (exception e) {
                  e.printstacktrace();
              }
          }
      }

      “body”由具体文本格式决定,此处以json为例。

相关文档

网站地图