请求签名认证

基本概念

  • Account Key, Account Secret: 用于标示开发者,获取方式见快速入门生成新的云密钥图中的帐号密钥
  • App Key, App Secret: 用于标示开发者的App,获取的方式见快速入门生成新的云密钥
  • Signature:根据Access Key和Secret Key和用户请求计算出的数字签名,用于验证用户身份。

Note 介绍签名算法时我们不区分Account Key和App Key,统称为Access Key;同时,我们也不区分Account Secret和App Secret,统称为Secret Key。

基于签名的认证过程

  1. 构建准备发往FDS的HTTP请求;
  2. 使用Access Key,Secret Key和构建好的请求内容,计算签名;
  3. 将计算好的签名和Access Key组合起来,置于HTTP请求的“Authorization” Header中,将请求发往FDS;
  4. FDS收到请求,从“Authorization”Header中解析Access Key和对应的签名;
  5. FDS用解析出的Access Key获取到对应的Secret Key;
  6. FDS用同样的签名算法计算签名,得到服务端签名;
  7. FDS对比服务端签名和用户请求中解析出来的签名,如果一致则认证通过,否则认证不通过。

签名算法

签名算法是签名认证的核心,下面是签名算法的详细介绍:

签名在HTTP Header中的格式

"Authorization: Galaxy-V2" + " " + Access Key + ":" + Signature;

签名计算

Signature = Base64(Hmac-Sha1(Secret Key, StringToSign));

签名字符串(StringToSign)的构造

StringToSign =
HttpMethod + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;

CanonicalizedHeaders构造

用户可以通过"x-xiaomi-"的方式,向FDS传自定义的Header,CanonicalizedHeader指的是规范化后的用户自定义的Headers,规范化的过程如下:

  1. 所有的Header都转化成小写;
  2. 将Header按key进行字典序排序;
  3. 将具有相同Key的Headers合并,多个值之间用";"分隔;
  4. 将上述字符串连接起来即是CanonicalizedHeaders。

CanonicalizedResource构造

CanonicalizedResource=
URI的相对路径 + 
URI中SubResrouce(ACL等)按字典序排序并用"&"拼接后得到的字符串

各语言实现参考

  • Android/Java: com.xiaomi.infra.galaxy:galaxy-fds-core:3.0.8 com.xiaomi.infra.galaxy.fds.auth.signature.Signer
  • c++
  • golang
  • iOS
  • php
  • python

各语言构造签名认证相关类

results matching ""

    No results matching ""