华为云AI开发平台ModelArts访问在线服务(APP认证)_云淘科技

部署在线服务支持开启APP认证,即ModelArts会为服务注册一个支持APP认证的接口,为此接口配置APP授权后,用户可以使用授权应用的AppKey+AppSecret或AppCode调用该接口。

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

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

方式一:使用Python语言通过AppKey+AppSecret认证鉴权方式发送预测请求
方式二:使用Java语言通过AppKey+AppSecret认证鉴权方式发送预测请求
方式三:使用Python语言通过AppCode认证鉴权方式发送预测请求
方式四:使用Java语言通过AppCode认证鉴权方式发送预测请求

前提条件

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

开启支持APP认证功能

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

登录ModelArts管理控制台,在左侧菜单栏中选择“部署上线 > 在线服务”,进入在线服务管理页面。
开启支持APP认证功能。

在部署为在线服务时,即“部署”页面,填写部署服务相关参数时,开启支持APP认证功能。
针对已部署完成的在线服务,进入在线服务管理页面,单击目标服务名称“操作”列的“修改”按钮,进入修改服务页面开启支持APP认证功能。

图1 部署页面开启支持APP认证功能

选择APP授权配置。从下拉列表中选择您需要配置的APP应用,如果没有可选项,您可以通过如下方式创建应用。

单击右侧“创建应用”,填写应用名称和描述之后单击“确定”完成创建。其中应用名称默认以“app_”开头,您也可以自行修改。
进入“部署上线>在线服务”页面,单击“授权管理”,进入“在线服务授权管理”页面,选择“创建应用”,详请参见在线服务授权管理。

开启支持APP认证功能后,将支持APP认证的服务授权给应用,用户可以使用创建的“AppKey/AppSecret”或“AppCode”调用服务的支持APP认证的接口。

在线服务授权管理

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

图2 在线服务授权管理

创建应用

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

查看、重置或删除应用

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

解绑服务

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

获取AppKey/AppSecret或AppCode

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

图3 添加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,不校验请求签名,从而实现快速响应。

您可以在服务详情页的“调用指南”页签(如图4)或者在线服务授权管理页面(如图2)获取API接口和AppKey/AppSecret和AppCode。请注意使用图中红框所示的API接口公网地址。当模型配置文件中apis定义了路径,调用地址后需拼接自定义路径。如:“{在线服务的调用地址}/predictions/poetry”。

图4 获取API的接口地址

方式一:使用Python语言通过AppKey+AppSecret认证鉴权方式发送预测请求

下载Python SDK并在开发工具中完成SDK配置。具体操作请参见在Python环境中集成API请求签名的SDK。
创建请求体,进行预测请求。

输入为文件格式

# coding=utf-8

import requests
import os
from apig_sdk import signer

if __name__ == '__main__':
    # Config url, ak, sk and file path.
    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.
    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认证鉴权方式发送预测请求

下载Java SDK并在开发工具中完成SDK配置。具体操作请参见在Java环境中集成API请求签名的SDK
创建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) {
        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.setUrl(url);

            // 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认证鉴权方式发送预测请求

下载Python SDK并在开发工具中完成SDK配置。具体操作请参见在Python环境中集成API请求签名的SDK。
创建请求体,进行预测请求。

输入为文件格式

# coding=utf-8

import requests
import os

if __name__ == '__main__':
    # Config url, app code and file path.
    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.
    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认证鉴权方式发送预测请求

下载Java SDK并在开发工具中完成SDK配置。具体操作请参见在Java环境中集成API请求签名的SDK
(可选)当预测请求的输入为文件格式时,Java工程依赖httpmime模块。

在工程“libs”中增加httpmime-x.x.x.jar。完整的Java依赖库如图5所示。

httpmime-x.x.x.jar建议使用4.5及以上版本,下载地址:https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime。

图5 Java依赖库

httpmime-x.x.x.jar添加完成后,在Java工程的.classpath文件中,补充httpmime信息,如下所示:













创建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) {
        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) {
        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为例。

父主题: 认证方式

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家