- 1.2 服务介绍
- 1.3.1 概念介绍
- 1.3.2 快速入门
- 1.3.3 申请Quota
- 1.3.4 集群环境
- 1.3.5 Fdsfuse介绍
- 1.3.6 Tensorflow中使用hdfs
- 1.4 客户端使用
- 1.4.1 安装命令行工具
- 1.4.2 使用命令行工具
- 1.4.3 使用Python SDK
- 1.4.4 使用Web控制台
- 1.5 TrainJob功能
- 1.5.1 训练任务组件和流程
- 1.5.2 上手Trainjob
- 1.5.3 使用GPU
- 1.5.4 使用FDS
- 1.5.5 使用Fuse
- 1.5.6 Trainjob高级功能
- 1.5.6.1 分布式训练
- 1.5.6.2 使用前置/后置命令
- 1.5.6.3 自动超参数调优
- 1.5.6.4 自动超参数调优Hpjob
- 1.5.6.5 自动超参数调优Hpjob
- 1.5.6.6 使用自定义镜像
- 1.5.6.7 使用TensorFlow模板应用
- 1.5.6.8 使用HDFS
- 1.5.6.9 使用HDFS FUSE
- 1.6 ModelService功能
- 1.6.1 模型服务使用流程
- 1.6.2 TensorFlow Serving介绍
- 1.6.3 使用GPU模型服务
- 1.6.4 使用多副本和负载均衡
- 1.6.5 在线服务的模型升级
- 1.6.6 模型服务监控
- 1.6.7 使用前置命令和后置命令
- 1.6.8 定制模型服务Docker镜像
- 1.6.9 使用客户端预测
- 1.6.9.1 使用通用gRPC客户端
- 1.6.9.2 使用Python客户端
- 1.6.9.3 使用Java客户端
- 1.6.9.4 使用Scala客户端
- 1.6.9.5 使用Golang客户端
- 1.6.9.6 使用C++客户端
- 1.7 DevEnv功能
- 1.7.1 开发环境使用流程
- 1.7.2 使用命令行管理开发环境
- 1.7.3 使用WEB控制台管理开发环境
- 1.7.4 高级功能
- 1.7.4.1 使用GPU开发环境
- 1.7.4.2 使用FDS FUSE存储
- 1.7.4.3 使用HDFS存储
- 1.7.4.4 使用HDFS FUSE存储
- 1.7.4.5 网络和安全
- 1.7.4.6 监控
- 1.7.4.7 定制开发环境Docker镜像
- 1.7.5 最佳实践
- 1.8 使用率监控
- 1.8.1 GPU使用率监控
- 1.9 TensorboardService功能
- 1.9.1 TensorBoard使用流程
- 1.9.2 TensorBoard介绍
- 1.10 API文档
- 1.10.1 签名规范
- 1.10.2 API文档
- 1.11 问题反馈
- 1.11.1 FAQ
- 1.11.2 技术支持
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.10.1 签名规范
简介
所有向Xiaomi Cloud-ML服务请求都需要带上请求和签名,客户端签名发送请求后,服务端会重新签名以认证用户身份。
签名算法
签名方法与AWS类似,需要注意签名的参数和顺序。 实现签名后需要通过下面的单元测试。
def test_sign(self):
url = 'https://api.github.com/user?a=b'
timestamp = '1474203860'
content_md5 = 'd41d8cd98f00b204e9800998ecf8427e'
app_secret = "sk"
self.assertEquals(
self.signer._sign(url, timestamp, content_md5, app_secret),
'\x10\xe1pv\x96\x1c\x96\xfb\xc7\xe2\x16\x9d\xf4Ma5\x1dO\x86f')
def test_sign_to_base64(self):
url = 'https://api.github.com/user?a=b'
timestamp = '1474203860'
content_md5 = 'd41d8cd98f00b204e9800998ecf8427e'
app_secret = "sk"
self.assertEquals(
self.signer._sign_to_base64(url, timestamp, content_md5, app_secret),
'EOFwdpYclvvH4had9E1hNR1PhmY=')
Python实现
服务端签名在cloud_ml_common目录中,代码如下。
import base64
import time
import hmac
import hashlib
from hashlib import sha1
from requests.auth import AuthBase
from urllib import unquote
from urlparse import urlparse
from constant import Constant
class Signer(AuthBase):
''' The signer class used to sign the request. '''
def __init__(self, app_key, app_secret):
self._app_key = str(app_key)
self._app_secret = str(app_secret)
def __call__(self, request):
url = request.url
if not request.body:
request.body = ""
timestamp = request.headers.get(Constant.TIMESTAMP, str(int(time.time())))
content_md5 = request.headers.get(Constant.CONTENT_MD5,
hashlib.md5(request.body).hexdigest())
request.headers[Constant.TIMESTAMP] = timestamp
request.headers[Constant.CONTENT_MD5] = content_md5
request.headers[Constant.AUTHORIZATION] = self._sign_to_base64(
url, timestamp, content_md5, self._app_secret)
request.headers[Constant.SECRET_KEY_ID] = self._app_key
return request
def _sign(self, url, timestamp, content_md5, app_secret):
''' Sign the specified http request. '''
string_to_sign = "{}\n{}\n{}\n".format(url, timestamp, content_md5)
digest = hmac.new(app_secret, string_to_sign, digestmod=sha1)
return digest.digest()
def _sign_to_base64(self, url, timestamp, content_md5, app_secret):
''' Sign the specified request to base64 encoded result. '''
signature = self._sign(url, timestamp, content_md5, app_secret)
return base64.encodestring(signature).strip()
def _get_header_value(self, http_headers, name):
if http_headers is not None and name in http_headers:
value = http_headers[name]
if type(value) is list:
return http_headers[name][0]
else:
return value
return ""
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论