- 最新动态
- 功能总览
- 产品介绍
- 数据治理方法论
- 准备工作
- 快速入门
-
用户指南
- DataArts Studio使用流程
- 购买并配置DataArts Studio
- 授权用户使用DataArts Studio
-
管理中心
- DataArts Studio支持的数据源
- 创建DataArts Studio数据连接
-
配置DataArts Studio数据连接参数
- DWS数据连接参数说明
- DLI数据连接参数说明
- MRS Hive数据连接参数说明
- MRS HBase数据连接参数说明
- MRS Kafka数据连接参数说明
- MRS Spark数据连接参数说明
- MRS Clickhouse数据连接参数说明
- MRS Hetu数据连接参数说明
- MRS Impala数据连接参数说明
- MRS Ranger数据连接参数说明
- MRS Presto数据连接参数说明
- Doris数据连接参数说明
- OpenSource ClickHouse数据连接参数说明
- RDS数据连接参数说明
- ORACLE数据连接参数说明
- DIS数据连接参数说明
- 主机连接参数说明
- Rest Client数据连接参数说明
- Redis数据连接参数说明
- SAP HANA数据连接参数说明
- LTS数据连接参数说明
- 配置DataArts Studio资源迁移
- 配置DataArts Studio企业模式环境隔离
- 管理中心典型场景教程
-
数据集成(CDM作业)
- 数据集成概述
- 约束与限制
- 支持的数据源
- 创建并管理CDM集群
-
在CDM集群中创建连接
- 创建CDM与数据源之间的连接
-
配置连接参数
- OBS连接参数说明
- PostgreSQL/SQLServer连接参数说明
- 数据仓库服务(DWS)连接参数说明
- 云数据库MySQL/MySQL数据库连接参数说明
- Oracle数据库连接参数说明
- DLI连接参数说明
- Hive连接参数说明
- HBase连接参数说明
- HDFS连接参数说明
- FTP/SFTP连接参数说明
- Redis连接参数说明
- DDS连接参数说明
- CloudTable连接参数说明
- MongoDB连接参数说明
- Cassandra连接参数说明
- DIS连接参数说明
- Kafka连接参数说明
- DMS Kafka连接参数说明
- 云搜索服务(CSS)连接参数说明
- Elasticsearch连接参数说明
- 达梦数据库 DM连接参数说明
- SAP HANA连接参数说明
- 分库连接参数说明
- MRS Hudi连接参数说明
- MRS ClickHouse连接参数说明
- 神通(ST)连接参数说明
- CloudTable OpenTSDB连接参数说明
- GBASE连接参数说明
- YASHAN连接参数说明
- 上传CDM连接驱动
- 新建Hadoop集群配置
-
在CDM集群中创建作业
- 新建表/文件迁移作业
- 新建整库迁移作业
-
配置CDM作业源端参数
- 配置OBS源端参数
- 配置HDFS源端参数
- 配置HBase/CloudTable源端参数
- 配置Hive源端参数
- 配置DLI源端参数
- 配置FTP/SFTP源端参数
- 配置HTTP源端参数
- 配置PostgreSQL/SQL Server源端参数
- 配置DWS源端参数
- 配置SAP HANA源端参数
- 配置MySQL源端参数
- 配置Oracle源端参数
- 配置分库源端参数
- 配置MongoDB/DDS源端参数
- 配置Redis源端参数
- 配置DIS源端参数
- 配置Kafka/DMS Kafka源端参数
- 配置Elasticsearch/云搜索服务源端参数
- 配置OpenTSDB源端参数
- 配置MRS Hudi源端参数
- 配置MRS ClickHouse源端参数
- 配置神通(ST)源端参数
- 配置达梦数据库 DM源端参数
- 配置YASHAN源端参数
- 配置CDM作业目的端参数
- 配置CDM作业字段映射
- 配置CDM作业定时任务
- CDM作业配置管理
- 管理单个CDM作业
- 批量管理CDM作业
- 时间宏变量使用解析
- 优化迁移性能
- 关键操作指导
- 使用教程
- 常见错误码参考
-
数据集成(离线作业)
- 离线作业概述
- 支持的数据源
- 新建离线处理集成作业
- 配置离线处理集成作业
-
配置作业源端参数
- 配置MySQL源端参数
- 配置Hive源端参数
- 配置HDFS源端参数
- 配置Hudi源端参数
- 配置PostgreSQL源端参数
- 配置SQLServer源端参数
- 配置Oracle源端参数
- 配置DLI源端参数
- 配置OBS源端参数
- 配置SAP HANA源端参数
- 配置Kafka源端参数
- 配置Rest Client源端参数
- 配置DWS源端参数
- 配置FTP/SFTP源端参数
- 配置Doris源端参数
- 配置HBase 源端参数
- 配置ClickHouse源端参数
- 配置ElasticSearch源端参数
- 配置MongoDB源端参数
- 配置RestApi源端参数
- 配置GBase源端参数
- 配置Redis源端参数
- 配置LTS源端参数
- 配置作业目的端参数
- 字段转换器配置指导
- 新增字段操作指导
- 数据集成(实时作业)
- 数据架构
-
数据开发
- 数据开发概述
- 数据管理
- 脚本开发
- 作业开发
- 集成作业开发
- Notebook开发
- 解决方案
- 运行历史
- 运维调度
- 配置管理
- 审批中心
- 下载中心
-
节点参考
- 节点概述
- 节点数据血缘
- CDM Job
- Data Migration
- DIS Stream
- DIS Dump
- DIS Client
- Rest Client
- Import GES
- MRS Kafka
- Kafka Client
- ROMA FDI Job
- DLI Flink Job
- DLI SQL
- DLI Spark
- DWS SQL
- MRS Spark SQL
- MRS Hive SQL
- MRS Presto SQL
- MRS Spark
- MRS Spark Python
- MRS ClickHouse
- MRS Impala SQL
- MRS Flink Job
- MRS MapReduce
- CSS
- Shell
- RDS SQL
- ETL Job
- Python
- DORIS SQL
- ModelArts Train
- Create OBS
- Delete OBS
- OBS Manager
- Open/Close Resource
- Data Quality Monitor
- Sub Job
- For Each
- SMN
- Dummy
- EL表达式参考
- 简易变量集参考
- 使用教程
- 数据质量
- 数据目录
- 数据安全
- 数据服务
- 审计日志
- 最佳实践
- SDK参考
-
API参考
- 使用前必读
- API概览
- 如何调用API
- 数据集成API
- 数据开发API(V1)
- 数据开发API(V2)
- 数据架构API
- 数据质量API
- 数据服务API
- 应用示例
- 附录
-
常见问题
-
咨询与计费
- 区域和可用区如何选择?
- 数据库、数据仓库、数据湖与华为智能数据湖方案是什么,有哪些区别和联系?
- DataArts Studio和沃土是什么关系?
- DataArts Studio和ROMA有什么差异?
- DataArts Studio是否支持私有化部署到本地或私有云?
- 如何在IAM中创建细粒度权限策略?
- 如何实现用户的工作空间隔离,使其无法查看其他未授权工作空间?
- 用户已添加权限,还是无法查看工作空间?
- IAM用户操作时报错“无xx权限”怎么办?
- DataArts Studio的工作空间可以删除吗?
- 实例试用/购买成功后,可以转移到其他账号下吗?
- DataArts Studio是否支持版本升级?
- DataArts Studio是否支持版本降级?
- 如何查看DataArts Studio的版本?
- 购买DataArts Studio实例时为什么选不到指定的IAM项目?
- DataArts Studio的会话超时时间是多少,是否支持修改?
- 套餐包到期未续订或按需资源欠费时,我的数据会保留吗?
- 如何查看套餐包的剩余时长?
- DataArts Studio实例中的CDM没有计费是什么原因?
- 为什么会提示每日执行节点个数超过上限,应该怎么处理?
- 管理中心
-
数据集成(CDM作业)
- CDM与其他数据迁移服务有什么区别,如何选择?
- CDM有哪些优势?
- CDM有哪些安全防护?
- 如何降低CDM使用成本?
- CDM未使用数据传输功能时,是否会计费?
- 已购买包年包月的CDM套餐包,为什么还会产生按需计费的费用?
- 如何查看套餐包的剩余时长?
- CDM可以跨账户使用吗?
- CDM集群是否支持升级操作?
- CDM迁移性能如何?
- CDM不同集群规格对应并发的作业数是多少?
- 是否支持增量迁移?
- 是否支持字段转换?
- Hadoop类型的数据源进行数据迁移时,建议使用的组件版本有哪些?
- 数据源为Hive时支持哪些数据格式?
- 是否支持同步作业到其他集群?
- 是否支持批量创建作业?
- 是否支持批量调度作业?
- 如何备份CDM作业?
- 如何解决HANA集群只有部分节点和CDM集群网络互通?
- 如何使用Java调用CDM的Rest API创建数据迁移作业?
- 如何将云下内网或第三方云上的私网与CDM连通?
- CDM是否支持参数或者变量?
- CDM迁移作业的抽取并发数应该如何设置?
- CDM是否支持动态数据实时迁移功能?
- CDM是否支持集群关机功能?
- 如何使用表达式方式获取当前时间?
- 日志提示解析日期格式失败时怎么处理?
- 字段映射界面无法显示所有列怎么处理?
- CDM迁移数据到DWS时如何选取分布列?
- 迁移到DWS时出现value too long for type character varying怎么处理?
- OBS导入数据到SQL Server时出现Unable to execute the SQL statement怎么处理?
- 获取集群列表为空/没有权限访问/操作时报当前策略不允许执行?
- Oracle迁移到DWS报错ORA-01555
- MongoDB连接迁移失败时如何处理?
- Hive迁移作业长时间卡顿怎么办?
- 使用CDM迁移数据由于字段类型映射不匹配导致报错怎么处理?
- MySQL迁移时报错“JDBC连接超时”怎么办?
- 创建了Hive到DWS类型的连接,进行CDM传输任务失败时如何处理?
- 如何使用CDM服务将MySQL的数据导出成SQL文件,然后上传到OBS桶?
- 如何处理CDM从OBS迁移数据到DLI出现迁移中断失败的问题?
- 如何处理CDM连接器报错“配置项 [linkConfig.iamAuth] 不存在”?
- 报错“配置项[linkConfig.createBackendLinks]不存在”或“配置项 [throttlingConfig.concurrentSubJobs] 不存在怎么办”?
- 新建MRS Hive连接时,提示:CORE_0031:Connect time out. (Cdm.0523) 怎么解决?
- 迁移时已选择表不存在时自动创表,提示“CDM not support auto create empty table with no column”怎么处理?
- 创建Oracle关系型数据库迁移作业时,无法获取模式名怎么处理?
- MySQL迁移时报错:invalid input syntax for integer: "true"
- 数据集成(实时作业)
- 数据架构
-
数据开发
- 数据开发可以创建多少个作业,作业中的节点数是否有限制?
- DataArts Studio支持自定义的Python脚本吗?
- 作业关联的CDM集群删除后,如何快速修复?
- 作业的计划时间和开始时间相差大,是什么原因?
- 相互依赖的几个作业,调度过程中某个作业执行失败,是否会影响后续作业?这时该如何处理?
- 通过DataArts Studio调度大数据服务时需要注意什么?
- 环境变量、作业参数、脚本参数有什么区别和联系?
- 打不开作业日志,返回404报错?
- 配置委托时获取委托列表失败如何处理?
- 数据开发创建数据连接,为什么选不到指定的周边资源?
- 配置了SMN通知,却收不到作业失败告警通知?
- 作业配置了周期调度,但是实例监控没有作业运行调度记录?
- Hive SQL和Spark SQL脚本执行失败,界面只显示执行失败,没有显示具体的错误原因?
- 数据开发节点运行中报TOKEN不合法?
- 作业开发时,测试运行后如何查看运行日志?
- 月周期的作业依赖天周期的作业,为什么天周期作业还未跑完,月周期的作业已经开始运行?
- 执行DLI脚本,报Invalid authentication怎么办?
- 创建数据连接时,在代理模式下为什么选不到需要的CDM集群?
- 作业配置了每日调度,但是实例没有作业运行调度记录?
- 查看作业日志,但是日志中没有内容?
- 创建了2个作业,但是为什么无法建立依赖关系?
- DataArts Studio执行调度时,报错提示“作业没有可以提交的版本”怎么办?
- DataArts Studio执行调度时,报错提示“作业中节点XXX关联的脚本没有提交的版本”怎么办?
- 提交调度后的作业执行失败,报depend job [XXX] is not running or pause怎么办?
- 如何创建数据库和数据表,数据库对应的是不是数据连接?
- 为什么执行完HIVE任务什么结果都不显示?
- 在作业监控页面里的“上次实例状态”只有运行成功、运行失败,这是为什么?
- 如何创建通知配置对全量作业都进行结果监控?
- 数据开发的并行执行节点数是多少?
- DataArts Studio是否支持修改时区?
- CDM作业改名后,在数据开发中如何同步?
- 执行RDS SQL,报错hll不存在,在DataArts Studio可以执行成功?
- 创建DWS数据连接时报错提示“The account has been locaked”怎么处理?
- 作业实例取消了,日志提示“The node start execute failed, so the current node status is set to cancel.”怎么处理?
- 调用数据开发接口报错“Workspace does not exists”怎么处理?
- Postman调用接口返回结果正常,为什么测试环境调用接口的URL参数不生效?
- 执行Python脚本报错:Agent need to be updated?
- 节点状态为成功,为什么日志显示运行失败?
- 调用数据开发API报错Unknown Exception?
- 调用创建资源的API报错“资源名不合法”是什么原因?
- 补数据的作业实例都是成功的,为什么补数据任务失败了?
- DWS数据连接可视化建表,报错提示“表已存在”,但是展开数据连接看不到该表?
- 调度MRS spark作业报错“The throttling threshold has been reached: policy user over ratelimit,limit:60,time:1 minute.”怎么处理?
- 执行Python脚本,报错“UnicodeEncodeError :‘ascii' codec cant encode characters in position 63-64 : ordinal not in range ( 128 )”怎么处理?
- 查看日志时,系统提示“OBS日志文件不存在,请检查文件是否被删除或者没有OBS写入权限。”怎么办?
- Shell/Python节点执行失败,后台报错session is down
- 请求头中参数值长度超过512个字符时,何如处理?
- 执行DWS SQL脚本时,提示id不存在,如何处理?
- 如何查看CDM作业被哪些作业进行调用?
- 使用python调用执行脚本的api报错:The request parameter invalid,如何处理?
- 在数据开发子模块中,新建的DLI SQL脚本默认队列是一个已删除的队列,怎么处理?
- 数据开发中的事件驱动是否支持线下kafka?
- 数据质量
- 数据目录
- 数据安全
- 数据服务
-
咨询与计费
-
更多文档
-
用户指南(吉隆坡区域)
- 产品介绍
- 准备工作
-
用户指南
- 使用DataArts Studio前的准备
- 管理中心
- 数据集成
-
数据开发
- 数据开发概述
- 数据管理
- 脚本开发
- 作业开发
- 解决方案
- 运行历史
- 运维调度
- 配置管理
-
节点参考
- 节点概述
- CDM Job
- Rest Client
- Import GES
- MRS Kafka
- Kafka Client
- ROMA FDI Job
- DLI Flink Job
- DLI SQL
- DLI Spark
- DWS SQL
- MRS Spark SQL
- MRS Hive SQL
- MRS Presto SQL
- MRS Spark
- MRS Spark Python
- MRS Flink Job
- MRS MapReduce
- CSS
- Shell
- RDS SQL
- ETL Job
- Python
- Create OBS
- Delete OBS
- OBS Manager
- Open/Close Resource
- Sub Job
- For Each
- SMN
- Dummy
- EL表达式参考
- 使用教程
-
常见问题
- 咨询
- 管理中心
-
数据集成
- 通用类
- 功能类
-
故障处理类
- OBS导入数据到SQL Server时出现Unable to execute the SQL statement怎么处理?
- Oracle迁移到DWS报错ORA-01555
- MongoDB连接迁移失败时如何处理?
- Hive迁移作业长时间卡住怎么办?
- 使用CDM迁移数据由于字段类型映射不匹配导致报错怎么处理?
- MySQL迁移时报错“JDBC连接超时”怎么办?
- 创建了Hive到DWS类型的连接,进行CDM传输任务失败时如何处理?
- 如何使用CDM服务将MySQL的数据导出成SQL文件,然后上传到OBS桶?
- 如何处理CDM从OBS迁移数据到DLI出现迁移中断失败的问题?
- 如何处理CDM连接器报错“配置项 [linkConfig.iamAuth] 不存在”?
- 创建数据连接时报错“配置项[linkConfig.createBackendLinks]不存在”或创建作业时报错“配置项 [throttlingConfig.concurrentSubJobs] 不存在”怎么办?
- 新建MRS Hive连接时,提示:CORE_0031:Connect time out. (Cdm.0523) 怎么解决?
- 迁移时已选择表不存在时自动创表,提示“CDM not support auto create empty table with no column”怎么处理?
- 创建Oracle关系型数据库迁移作业时,无法获取模式名怎么处理?
-
数据开发
- 数据开发可以创建多少个作业,作业中的节点数是否有限制?
- 作业的计划时间和开始时间相差大,是什么原因?
- 相互依赖的几个作业,调度过程中某个作业执行失败,是否会影响后续作业?这时该如何处理?
- 通过DataArts Studio调度大数据服务时需要注意什么?
- 环境变量、作业参数、脚本参数有什么区别和联系?
- 作业失败无法查看节点错误日志?
- 配置委托时获取委托列表失败如何处理?
- 每日执行节点个数超过上限,怎么排查哪些作业调度节点比较多?
- 数据开发创建数据连接,为什么选不到指定的周边资源?
- 作业配置了周期调度,但是实例监控没有作业运行调度记录?
- Hive SQL和Spark SQL脚本脚本执行失败,界面只显示执行失败,没有显示具体的错误原因?
- 数据开发节点运行中报TOKEN不合法?
- 作业开发时,测试运行后如何查看运行日志?
- 月周期的作业依赖天周期的作业,为什么天周期作业还未跑完,月周期的作业已经开始运行?
- 执行DLI脚本,报Invalid authentication怎么办?
- 创建数据连接时,在代理模式下为什么选不到需要的CDM集群?
- 作业配置了每日调度,但是实例没有作业运行调度记录?
- 查看作业日志,但是日志中没有内容?
- 创建了2个作业,但是为什么无法建立依赖关系?
- DataArts Studio执行调度时报错:提示作业没有可以提交的版本怎么办?
- DataArts Studio执行调度时报错:作业中节点XXX关联的脚本没有提交的版本?
- 提交调度后的作业执行失败,报depend job [XXX] is not running or pause怎么办?
- 如何创建数据库和数据表,数据库对应的是不是数据连接?
- 为什么执行完HIVE任务什么结果都不显示?
- 在作业监控页面里的 “上次实例状态” 只有运行成功、运行失败,这是为什么?
- 如何创建通知配置对全量作业都进行结果监控?
- DataArts Studio的版本规格与并行执行节点数之间有什么关系?
- 启动用户、执行用户、工作空间委托、作业委托它们之间的优先级顺序是什么?
- API参考(吉隆坡区域)
-
用户指南(吉隆坡区域)
- 通用参考
链接复制成功!
其他编程语言
APP认证工作原理
- 构造规范请求。
将待发送的请求内容按照与API网关后台约定的规则组装,确保客户端签名、API网关后台认证时使用的请求内容一致。
- 使用规范请求和其他信息创建待签字符串。
- 使用AK/SK和待签字符串计算签名。
- 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。
APP签名仅支持Body体12M及以下的请求签名。
步骤1:构造规范请求
使用APP方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与API网关使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结果,从而完成身份校验。
HTTP请求规范伪代码如下:
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
可以通过以下示例来说明规范请求的构造步骤。
假设原始请求如下:
GET https://{apig-endpoint}/app1?b=2&a=1 HTTP/1.1 Host: {apig-endpoint} X-Sdk-Date: 20180330T123600Z
- 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。
HTTP请求方法,如GET、PUT、POST等。请求方法示例:
GET
- 添加规范URI参数(CanonicalURI),以换行符结束。
释义:
规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。
格式:
根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。
举例:
示例中的URI:/app1,此时规范的URI编码为:
GET /app1/
说明:
计算签名时,URI必须以“/”结尾。发送请求时,可以不以“/”结尾。
- 添加规范查询字符串(CanonicalQueryString),以换行符结束。
释义:
查询字符串,即查询参数。如果没有查询参数,则为空字符串,即规范后的请求为空行。
格式:
规范查询字符串需要满足以下要求:
- 根据以下规则对每个参数名和值进行URI编码:
- 请勿对RFC 3986定义的任何非预留字符进行URI编码,这些字符包括:A-Z、a-z、0-9、-、_、.和~。
- 使用%XY对所有非预留字符进行百分比编码,其中X和Y为十六进制字符(0-9和A-F)。例如,空格字符必须编码为%20,扩展UTF-8字符必须采用“%XY%ZA%BC”格式。
- 对于每个参数,追加“URI编码的参数名称=URI编码的参数值”。如果没有参数值,则以空字符串代替,但不能省略“=”。
例如以下含有两个参数,其中第二个参数parm2的值为空。
parm1=value1&parm2=
- 按照字符代码以升序顺序对参数名进行排序。例如,以大写字母F开头的参数名排在以小写字母b开头的参数名之前。
- 以排序后的第一个参数名开始,构造规范查询字符串。
举例:
示例中包含两个可选参数:a、b
GET /app1/ a=1&b=2
- 根据以下规则对每个参数名和值进行URI编码:
- 添加规范消息头(CanonicalHeaders),以换行符结束。
释义:
规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601标准的UTC时间格式:YYYYMMDDTHHMMSSZ。如果API发布到非RELEASE环境时,需要增加自定义的环境名称。
格式:
CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头(CanonicalHeadersEntry)的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'
说明:
- Lowercase表示将所有字符转换为小写字母的函数。
- Trimall表示删除值前后的多余空格的函数。
- 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的换行符,因此会出现一个空行。
举例:
GET /app1/ a=1&b=2 host:{apig-endpoint} x-sdk-date:20180330T123600Z
须知:
规范消息头需要满足以下要求:- 将消息头名称转换为小写形式,并删除前导空格和尾随空格。
- 按照字符代码对消息头名称进行升序排序。
例如原始消息头为:
Host: {apig-endpoint}\n Content-Type: application/json;charset=utf8\n My-header1: a b c \n X-Sdk-Date:20180330T123600Z\n My-Header2: "a b c" \n
规范消息头为:
content-type:application/json;charset=utf8\n host:{apig-endpoint}\n my-header1:a b c\n my-header2:"a b c"\n x-sdk-date:20180330T123600Z\n
- 添加用于签名的消息头声明(SignedHeaders),以换行符结束。
释义:
用于签名的请求消息头列表。通过添加此消息头,向API网关告知请求中哪些消息头是签名过程的一部分,以及在验证请求时API网关可以忽略哪些消息头。X-Sdk-date必须作为已签名的消息头。
格式:
SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ...
已签名的消息头需要满足以下要求:将已签名的消息头名称转换为小写形式,按照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。
Lowercase表示将所有字符转换为小写字母。
举例:
以下表示有两个消息头参与签名:host、x-sdk-date
GET /app1/ a=1&b=2 host:{apig-endpoint} x-sdk-date:20180330T123600Z host;x-sdk-date
- 使用SHA 256哈希函数以基于HTTP或HTTPS请求正文中的body体(RequestPayload),创建哈希值。
释义:
请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其中Hash表示生成消息摘要的函数,当前支持SHA-256算法。HexEncode表示以小写字母形式返回摘要的Base-16编码的函数。例如,HexEncode("m") 返回值为“6d”而不是“6D”。输入的每一个字节都表示为两个十六进制字符。
说明:
计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使用空字符串""来计算。
举例:
本示例为GET方法,body体为空。经过哈希处理的body(空字符串)如下:
GET /app1/ a=1&b=2 host:{apig-endpoint} x-sdk-date:20180330T123600Z host;x-sdk-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。
算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest)))
经过哈希处理的规范请求示例:
4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906
步骤2:创建待签字符串
对HTTP请求进行规范并取得请求的哈希值后,将其与签名算法、签名时间一起组成待签名字符串。
StringToSign = Algorithm + \n + RequestDateTime + \n + HashedCanonicalRequest
伪代码中参数说明如下。
- Algorithm
签名算法。对于SHA 256,算法为SDK-HMAC-SHA256。
- RequestDateTime
请求时间戳。与请求消息头X-Sdk-Date的值相同,格式为YYYYMMDDTHHMMSSZ。
- HashedCanonicalRequest
经过哈希处理的规范请求。
上述例子得到的待签字符串为:
SDK-HMAC-SHA256 20180330T123600Z 4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906
步骤3:计算签名
将APP secret和创建的待签字符串作为加密哈希函数的输入,计算签名,将二进制值转换为十六进制表示形式。
伪代码如下:
signature = HexEncode(HMAC(APP secret, string to sign))
其中HMAC指密钥相关的哈希运算,HexEncode指转十六进制。伪代码中参数说明如表1所示。
参数名称 |
参数解释 |
---|---|
APP secret |
签名密钥,认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 |
string to sign |
创建的待签字符串 |
假设APP secret为12345678-1234-1234-1234-123456781234,则计算得到的signature为:
cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2
步骤4:添加签名信息到请求头
在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包含在已签名消息头中,主要用于身份验证。
伪代码如下:
Authorization header创建伪码: Authorization: algorithm Access=APP key, SignedHeaders=SignedHeaders, Signature=signature
需要注意的是算法与Access之前没有逗号,但是SignedHeaders与Signature之前需要使用逗号隔开。
得到的签名消息头为:
Authorization: SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d-c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2
得到签名消息头后,将其分别以Authorization和x-Authorization参数增加到原始HTTP请求头内容中,请求将被发送给API网关,由API网关完成身份认证。身份认证通过后,该请求才会发送给后端服务进行业务处理。