请求签名认证
基本概念
- 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。
基于签名的认证过程
- 构建准备发往FDS的HTTP请求;
- 使用Access Key,Secret Key和构建好的请求内容,计算签名;
- 将计算好的签名和Access Key组合起来,置于HTTP请求的“Authorization” Header中,将请求发往FDS;
- FDS收到请求,从“Authorization”Header中解析Access Key和对应的签名;
- FDS用解析出的Access Key获取到对应的Secret Key;
- FDS用同样的签名算法计算签名,得到服务端签名;
- 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,规范化的过程如下:
- 所有的Header都转化成小写;
- 将Header按key进行字典序排序;
- 将具有相同Key的Headers合并,多个值之间用";"分隔;
- 将上述字符串连接起来即是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