文档首页 > > AI工程师用户指南> 部署模型> 在线服务>

访问在线服务(APP认证)

访问在线服务(APP认证)

分享
更新时间:2021/06/04 GMT+08:00

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

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

  • 开启支持APP认证功能:开启支持APP认证并创建应用。
  • 在线服务授权管理:对创建的应用进行管理,包括查看、重置或删除应用,绑定或解绑应用对应的在线服务,获取“AppKey/AppSecret”“AppCode”
  • APP认证鉴权:调用支持APP认证的接口需要进行认证鉴权,支持两种鉴权方式,您可以选择其中一种进行认证鉴权。
  • 以Python语言为例准备环境:在APP认证鉴权完成之后,您可以准备调用环境进行接口调用。
  • 调用API示例:使用授权应用信息调用该接口进行预测。

前提条件

  • 数据已完成准备:已在ModelArts中创建状态“正常”可用的模型。
  • 由于在线运行需消耗资源,确保帐户未欠费。

开启支持APP认证功能

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

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

在线服务授权管理

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

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

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

  • 查看、重置或删除应用

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

  • 解绑服务

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

  • 获取AppKey/AppSecret或AppCode

    调用接口需要进行APP鉴权,在创建应用时自动生成“AppKey/AppSecret”“AppCode”也可以通过单击“+添加AppCode”自动生成。

    图3 添加AppCode

APP认证鉴权

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

调用支持APP认证的接口有如下两种认证方式,您可以选择其中一种进行认证鉴权。推荐使用AppKey/AppSecret认证,其安全性比AppCode认证要高。

  • AppCode认证:通过AppCode认证通用请求。
  • AppKey/AppSecret认证:通过AppKey(APP访问密钥ID)与AppSecret(APP私有访问密钥),对请求进行加密签名,可标识发送方,并防止请求被修改。

您可以在服务详情页的“调用指南”页签(如图4)或者在线服务授权管理页面(如图2)获取API接口和AppKey/AppSecret和AppCode。请注意使用图中红框所示的API接口地址。

图4 获取API的接口地址

AppCode认证

当使用APP认证,且开启了简易认证模式,API请求既可以选择使用Appkey和AppSecret做签名和校验,也可以选择使用AppCode进行简易认证。ModelArts默认启用简易认证。

AppCode认证就是在调用API的时候,在HTTP请求头部消息增加一个参数“X-Apig-AppCode”(参数值为“AppCode”),而不需要对请求内容签名,API网关也仅校验AppCode,不校验请求签名,从而实现快速响应。示例代码如下:

import requests
url = 'https://e27faf2cc66a42fbad2dce18747962e5.apig.cn-north-4.huaweicloudapis.com/v1/infers/xxxxxx/goodbye'
headers={'Content-Type':'application/json',
         'X-Apig-Appcode':'dd19xxxxxx'}
response=requests.request('GET', url, headers=headers)
print(response.text)
  • 当APP不支持AppCode时,可使用AppKey进行简易认证,即在调用API的时候,在HTTP请求头部消息增加一个参数“apikey”(参数值为“AppKey”),实现快速认证。
  • 使用AppCode认证访问的更多方式可参考访问在线服务(Token认证)

AppKey/AppSecret认证

AppKey/AppSecret认证就是通过应用的AppKey和AppSecret进行签名认证。

  • AppKey:APP访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。
  • AppSecret:与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。

使用AppKey/AppSecret认证时,您需要使用专门的签名SDK对请求进行签名。

以Python语言为例准备环境

在APP认证鉴权完成之后,您可以准备调用环境进行接口调用。此章节内容以Python语言为例介绍SDK使用方式,其他语言的SDK下载与使用示例请参见《API网关 APIG开发指南》

  1. 获取API的接口地址、请求方法、AppKey和AppSecret。获取方式请参见APP认证鉴权
  2. Python官网获取并安装Python安装包(支持使用2.7.9或3.X版本)。Python安装完成后,您可以执行命令pip install requests,通过Python通用包管理工具pip安装“requests”库。

    如果使用pip安装requests库遇到证书错误,请下载并使用Python执行此文件,升级pip,然后再执行以上命令安装。

  3. IntelliJ IDEA官网获取并安装IntelliJ IDEA。在IntelliJ IDEA中安装Python插件, 如图5所示。
    图5 安装Python插件
  4. 获取SDK。下载SDK,获取“ApiGateway-python-sdk.zip”压缩包,解压后目录结构如下:
    表1 SDK压缩包解压目录

    名称

    说明

    apig_sdk\__init__.py

    SDK代码

    apig_sdk\signer.py

    main.py

    示例代码

    backend_signature.py

    后端签名示例代码

    licenses\license-requests

    第三方库license文件

  5. 新建工程。
    1. 打开IDEA,选择菜单File > New > Project。在弹出的“New Project”对话框中选择“Python”,单击“Next”
      图6 新建工程
    2. 再次单击“Next”,弹出以下对话框。单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”完成工程创建。
      图7 选择解压后的SDK路径
  6. 完成工程创建后,目录结构如下。其中“main.py”为示例代码,请根据实际情况修改参数后使用。
    图8 新建工程的目录结构

调用API示例

  1. 在工程中引入“apig_sdk”
    1
    2
    from apig_sdk import signer
    import requests
    
  2. 生成一个新的Signer,填入“AppKey”“AppSecret”,获取方式请参见APP认证鉴权
    1
    2
    3
    sig = signer.Signer()
    sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"
    sig.Secret = "******"
    
  3. 生成一个Request对象,指定方法名、请求uri、header和body。
    r= signer.HttpRequest(method, uri, header, body)
    表2 HttpRequest参数说明

    参数

    子参数

    是否必填

    说明

    method

    -

    可填“GET”“POST”“PUT”“DELETE”

    uri

    -

    填入在线服务的API接口,获取接口方式参见APP认证鉴权

    header

    x-stage

    接口发布环境,必填,当前仅支持“RELEASE”

    Content-Type

    内容类型,当前支持“application/json”“multipart/form-data”形式请求体请参考表3

    x-sdk-content-sha256

    签名方式,可填“UNSIGNED-PAYLOAD”,表示不对body进行签名认证。

    当body为文件时,该参数必填。

    body

    -

    支持json格式,示例 :"{\"xxx\":\"xxx\"}"。

    1. 当请求体为json格式
      r = signer.HttpRequest("POST",
                             "https://1684994b180244de9d141c00d3e52c73.apig.exampleRegion.huaweicloudapis.com/v1/infers/exampleServiceId",
                             {"x-stage": "RELEASE","Content-Type":"application/json"},"{\"xxx\":\"xxx\"}")
    2. 当请求体为图片格式,您需要构造multipart/form-data形式的请求体。

      请求体样式:files={"请求参数":("文件路径",文件内容,“文件类型”,请求头)}

      表3 files参数

      参数

      说明

      请求参数

      在线服务输入参数名称。

      文件路径

      上传文件的路径。

      文件内容

      上传文件的内容。

      文件类型

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

      • txt类型:text/plain
      • jpg/jpeg类型:image/jpeg
      • png类型:image/png

      请求头

      建议填“{}”,请求头在“HttpRequest”参数“header”中填入。

      如果您访问请求参数为images,输入格式为file类型的在线服务,示例如下。

      图9 访问在线服务
      1
      2
      3
      r = signer.HttpRequest("POST","https://63fb035aeef34368880448a94cb7f440.apig.cn-north-4.huaweicloudapis.com/v1/infers/76c41384-23ab-45f9-a66e-892e7bc2be53",
      {"x-stage": "RELEASE", "x-sdk-content-sha256": "UNSIGNED-PAYLOAD"})
      files = {"images": ("flower.png", open("flower.png", "rb"), "image/png", {})}
      
  4. 进行签名,执行此函数会在请求参数中添加用于签名的“X-Sdk-Date”头和“Authorization”头。
    1
    sig.Sign(r)
    
  5. 调用API,查看访问结果。
    resp = requests.request(method,url, headers, data, files)
    表4 request参数说明

    参数

    说明

    method

    填入签名后Request对象的请求方法。

    url

    填入签名后Request对象的请求地址。

    headers

    填入签名后Request对象的headers。

    data

    填入Request对象的body请求体,仅支持Json格式。

    files

    填入multipart/form-data形式的请求体。

    1. 当请求体为json格式
      1
      2
      3
      resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data=r.body)
      print(resp.status_code, resp.reason)
      print(resp.content)
      
    2. 当请求体为图片格式
      1
      2
      3
      resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data={}, files=files)
      print(resp.status_code, resp.reason)
      print(resp.content)
      
分享:

    相关文档

    相关产品