本节介绍如何创建签名并将其添加到请求中。
## **主题**
* 签名的工作原理
* 请求中的签署过程是什么样
* 签名步骤的摘要
* [任务 1:创建规范请求](create-canonical-request.md)
* [任务 2:创建待签字符串](create-string-to-sign.md)
* [任务 3:为 GSDATA Signature 计算签名](calculate-signature.md)
* [任务 4:将签名信息添加到请求](add-signature-to-request.md)
#### **签名的工作原理**
1. 您创建一个规范请求。
2. 您使用规范请求和一些其他信息来创建要签署的字符串。
3. 您使用自己的 gsdata api appkey 来生成一个签名密钥,并使用该签名密钥以及要签署的字符串来创建签名。
4. 您将生成的签名添加到 HTTP 请求的标头中或者作为查询字符串参数添加。
清博开放平台 收到请求后,将执行您完成的相同步骤来计算签名。之后 GSDATA接口服务器 会将计算得到的签名与您在请求中发送的签名进行比较。如果签名匹配,则处理请求。如果签名不匹配,则拒绝请求。
#### **请求中的签署过程是什么样**
以下示例演示了 HTTP 请求(不带任何签名信息)从您的客户端发送到 GSDATA 时可能的样子。
~~~
GET http://api.gsdata.cn/weixin/v1/users?wx_name=rmrbwx&page=1&per-page=20 HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: api.gsdata.cn
x-gsdata-date: 20150830T123600Z
~~~
在完成签名任务之后,请将身份验证信息添加到请求中。您可通过两种方式添加身份验证信息:
#### **Authorization 标头**
您可使用 Authorization 标头将身份验证信息添加到请求中。尽管该 HTTP 标头名为 Authorization,但签名信息实际上是用于身份验证的,目的是确定请求方。
Authorization 标头包含以下信息:
* 用于签名的算法 (GSDATA-HMAC-SHA256)
* 凭证范围(包含您的访问密钥 ID)
* 已签名标头的列表
* 计算签名。该签名基于您的请求信息,由您使用 gsdata 密钥生成。该签名用于向 gsdata 确认您的身份。
下面的示例说明在您创建签名信息并将它添加到请求的 Authorization 标头之后,前面的请求看起来是什么样。
~~~
POST http://api.gsdata.cn/weixin/v1/users?wx_name=rmrbwx&page=1&per-page=20 HTTP/1.1
Authorization: GSDATA-HMAC-SHA256 SignedHeaders=content-type;host;x-gsdata-date, Signature=d37af66cc90dc26bb2e27d2a97316b729b82589b5e4648f1ae34cb83a3f546cd
content-type: application/x-www-form-urlencoded; charset=utf-8
host: api.gsdata.cn
x-gsdata-date: 20150830T123600Z
~~~
### **签名步骤的摘要**
要创建已签名的请求,请完成以下操作:
* 任务 1:创建规范请求
将请求的内容(主机、操作、标头等)组织为标准(规范)格式。规范请求是用于创建待签字符串的输入之一。
* 任务 2:创建待签字符串
使用规范请求和额外信息(例如算法、请求日期、凭证范围和规范请求的摘要(哈希))创建待签字符串。
* 任务 3:为 GSDATA Signature 计算签名
使用 GSDATA 秘密访问密钥作为初始哈希操作的密钥,对请求日期、服务执行一系列加密哈希操作(HMAC 操作),从而派生签名密钥。在派生签名密钥后,通过对待签字符串执行加密哈希操作来计算签名。使用派生的签名密钥作为此操作的哈希密钥。
* 任务 4:将签名信息添加到请求
在计算签名后,将其添加到请求的 HTTP 标头或查询字符串中。