
# OBS签名机制概述
#### 功能简介
客户端每次调用OBS API时，都需要在HTTP调用请求中携带签名信息，服务端会对收到的签名信息进行验证。签名验证的目的是：
- **对请求者进行身份验证，防止未授权用户访问。**请求携带的签名包含用户相关信息，华为云会对请求者身份进行验证，只有已授权用户的密钥才能通过签名检查，成功调用API。
- **防止传输数据被篡改**。对数据签名并检验，保障传输内容完整性。
- **防止签名超期后信息被盗用**。设置签名有效期，只有在有效期内签名可以使用，超过有效期后签名失效。
 
#### 原理说明
OBS签名机制的运作流程如[图1]所示：
图1OBS API调用的签名和验签机制   
![](https://support.huaweicloud.com/api-obs/figure/zh-cn_image_0000001984688913.png "点击放大")
表1OBS API调用的签名和验签机制 
| **执行端** | **序号** | **步骤**          | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| 客户端     | 1      | 构造HTTP请求        | 用户根据自身诉求构建HTTP请求消息，一个完整的API调用请求包含请求URI、请求方法、请求消息头、请求消息体（可选），如何构造API请求详见[构造请求](https://support.huaweicloud.com/api-obs/obs_04_0007.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 客户端     | 2      | 计算签名S           | 根据构造的HTTP请求和用户访问密钥计算签名S。您可以根据签名携带方式选择一种签名计算方式： - [Header携带时如何计算签名？](https://support.huaweicloud.com/api-obs/obs_04_0010.html)  - [URL携带时如何计算签名？](https://support.huaweicloud.com/api-obs/obs_04_0011.html)  - [表单携带时的如何计算签名？](https://support.huaweicloud.com/api-obs/obs_04_0012.html)             |
| 客户端     | 3      | 将签名S添加到请求消息中    | 将签名添加到请求消息中，消息携带签名的方式有3种： - [添加到HTTP请求的Authorization Header头域](https://support.huaweicloud.com/api-obs/obs_04_0010.html)  - [添加到URL的Query参数](https://support.huaweicloud.com/api-obs/obs_04_0011.html)  - POST上传（表单上传）情况下，[添加到表单](https://support.huaweicloud.com/api-obs/obs_04_0012.html)   |
| 客户端     | 4      | 发送携带签名S的API调用请求 | 将携带签名信息的请求发送给服务端。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| OBS服务端  | 5      | 接收调用请求          | 接受客户端的调用请求。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| OBS服务端  | 6      | 验证签名            | 服务端根据接收到的HTTP请求和用户访问密钥再次计算签名S'，比较S'与客户端计算的签名S是否一致，如果一致则签名验证成功，不一致则验证失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| OBS服务端  | 7      | 返回API调用结果       | - 如果验证成功则继续执行API，然后向客户端返回API执行结果。  - 如果验证失败则通知客户端验证失败，状态码为403 Forbidden，错误码为SignatureDoesNotMatch。定位和修复签名不匹配行为请参见[签名不匹配（SignatureDoesNotMatch）如何处理](https://support.huaweicloud.com/obs_faq/obs_faq_0173.html)                                                                                                                                                                                                                                           |
| 客户端     | 8      | 接收服务端响应         | 客户端接收服务端响应。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   
#### 携带签名的方式
OBS支持3种携带签名的方式，分别[是Header携带](https://support.huaweicloud.com/api-obs/obs_04_0010.html)、[URL携带](https://support.huaweicloud.com/api-obs/obs_04_0011.html)和[表单携带](https://support.huaweicloud.com/api-obs/obs_04_0012.html)。表单携带签名仅适用于POST上传接口。Header和URL携带签名的区别如下表所示：
表2OBS API调用携带签名 
| **对比项**            | **Header携带签名**                                                                                                                       | **URL携带签名**                                                                                                                                                                 |
|:---|:---|:---|
| 适用场景               | 一般情况下，推荐您使用在Header中携带签名。                                                                                                             | 使用在URL中签名的方式，会将授权的数据在过期时间内暴露在互联网上，具有一定的风险。该方式适用于在不提供给第三方访问密钥的情况下，让第三方能用预签发的URL来进行身份认证，并执行预定义操作。 如果您想通过浏览器访问OBS，建议您使用URL携带签名。 |
| 是否支持设置Expires      | 否                                                                                                                                    | 是                                                                                                                                                                           |
| 是否支持设置Date         | 是                                                                                                                                    | 否                                                                                                                                                                           |
| 常用API              | 所有API接口                                                                                                                              | GET、PUT                                                                                                                                                                     |
| 时间格式               | 通过Date头域表示请求生成时间，Date必须为RFC 1123格式的GMT时间。 如果Date与当前服务器的时间相差超过15分钟时，则服务端返回403，认为请求已失效。 | Expires字段表示临时授权失效的时间，单位：秒。超过该时间后，URL签名失效。                                                                                                                                   |
| Signature是否需要URL编码 | 否                                                                                                                                    | 是                                                                                                                                                                           |
   
