ak和sk怎么认证海康威视_aksk鉴权
简介
鉴权功能的位置处于基础服务的接⼊⽹关中。
1. 认证简介
本鉴权⽅案是在api层⾯上进⾏,通过使⽤Access Key/Secret Key加密的⽅法来对验证某个请求的调⽤者⾝份。
当接⼊⽹关接收到业务调⽤⽅的请求时,将使⽤相同的SK和同样的认证机制⽣成认证字符串,并与⽤户请求中包含的认证字符串进⾏⽐对。如果认证字符串相同,系统认为⽤户拥有指定的操作权限,并执⾏相关操作;如果认证字符串不同,系统将忽略该操作并返回错误码。
2. 认证过程
业务云侧请求洪恩在线翻译
初三英语复习note left of 业务云侧: 预置分配的AK/SK
业务云侧->业务云侧: ⽣成认证字符串
业务云侧->⽹关: 携带认证字符串的业务请求
⽹关->⽹关: 鉴权
邪恶新世界⽹关-->业务云侧: 鉴权失败,返回401
⽹关->基础服务: 鉴权成功,透传请求
业务端侧请求
业务端侧->业务云侧: 获取携带认证字符串某个api的请求url
note right of 业务云侧: 预置分配的AK/SK
业务云侧->业务云侧: ⽣成认证字符串
业务云侧->业务端侧: 返回携带认证字符串的url
业务端侧->⽹关: 使⽤业务云侧返回的url进⾏业务请求
⽹关->⽹关: 鉴权
⽹关-->业务云侧: 鉴权失败,返回401
⽹关->基础服务: 鉴权成功,透传请求
3. 认证字符串⽣成简介
3.1 概述
transform在⽣成认证字符串之前,⾸先需要⽣成Signature。为了⽣成Signature,⽤户需要⾸先构建CanonicalRequest并计算SigningKey。
GET
POST
PUT
DELETE
HEAD
CanonicalURI:是对URL中的绝对路径进⾏编码后的结果。要求绝对路径必须以“/”开头,不以“/”开头的需要补充上,空路径
为“/”,即CanonicalURI = UriEncodeExceptSlash(Path)。
举例:
CanonicalQueryString:对于URL中的Query String(Query String即URL中“?”后⾯的“key1 = valve1 & key2 = valve2 ”字符串)进⾏编码后的结果。
编码⽅法为:
将Query String根据&拆开成若⼲项,每⼀项是key=value或者只有key的形式。
对拆开后的每⼀项进⾏如下处理:
对于key是authorization,直接忽略。
对于只有key的项,转换为UriEncode(key) + "="的形式。
对于key=value的项,转换为 UriEncode(key) + "=" + UriEncode(value) 的形式。这⾥value可以是空字符串。
将上⾯转换后的所有字符串按照字典顺序排序。
将排序后的字符串按顺序⽤ & 符号链接起来。
举例:
根据 & 拆开成 text 、text1=测试 和 text10=test 三项。
对每⼀项进⾏处理:
text => UriEncode("text") + "=" => text=
text1=测试 => UriEncode("text1") + "=" + UriEncode("测试") => text1=%E6%B5%8B%E8%AF%95
text10=test => UriEncode("text10") + "=" + UriEncode("test")=> text10=test
对 text= 、 text1=%E6%B5%8B%E8%AF%95 和 text10=test 按照字典序进⾏排序。它们有共同前缀text,但是=的ASCII码⽐所有数字的ASCII码都要⼤,因此 text1=%E6%B5%8B%E8%AF%95 和 text10=test 排在 text= 的前⾯。同样,text10=test 要排在
text1=%E6%B5%8B%E8%AF%95 之前。最终结果是 text10=test 、text1=%E6%B5%8B%E8%AF%95 、text= 。
把排序好的三项 text10=test 、 text1=%E6%B5%8B%E8%AF%95 、 text= ⽤&连接起来得到
text10=test&text1=%E6%B5%8B%E8%AF%95&text=。
CanonicalHeaders:对HTTP请求中的Header部分进⾏选择性编码的结果。
您可以⾃⾏决定哪些Header 需要编码。唯⼀要求是Host域必须被编码。⼤多数情况下,我们推荐您对以下Header进⾏编码,也可以使⽤其他header,此处不做限制:
Host
Content-Length
Content-Type
Content-MD5
对于每个要编码的Header进⾏如下处理:
将Header的名字变成全⼩写。
将Header的值去掉开头和结尾的空⽩字符。
经过上⼀步之后值为空字符串的Header忽略,其余的转换为 UriEncode(name) + ":" + UriEncode(value) 的形式。把上⾯转换后的所有字符串按照字典序进⾏排序。如何打造高效课堂
伦敦残奥会开幕式将排序后的字符串按顺序⽤\n符号连接起来得到最终的CanonicalQueryHeaders。
举例:
不使⽤signedHeaders默认值。若希望对 Date 进⾏编码,则需要⽤到signedHeaders。
要编码的Header如下:
Host:
Date: Mon, 27 Apr 2015 16:23:49 +0800
Content-Type: text/plain
Content-Length: 8
Content-Md5: NFzcPqhviddjRNnSOGo4rw==
⾸先把所有名字都改为⼩写。
host:
date: Mon, 27 Apr 2015 16:23:49 +0800
content-type: text/plain
content-length: 8
envelopecontent-md5: NFzcPqhviddjRNnSOGo4rw==
将Header的值去掉开头和结尾的空⽩字符。
host:
registry
date:Mon, 27 Apr 2015 16:23:49 +0800
content-type:text/plain
content-length:8
content-md5:NFzcPqhviddjRNnSOGo4rw==
做UriEncode。
host:
date:Mon%2C%2027%20Apr%202015%2016%3A23%3A49%20%2B0800blacked
content-type:text%2Fplain
content-length:8
content-md5:NFzcPqhviddjRNnSOGo4rw%3D%3D?
把上⾯转换后的所有字符串按照字典序进⾏排序。
content-length:8
content-md5:NFzcPqhviddjRNnSOGo4rw%3D%3D?cayla
content-type:text%2Fplain
date:Mon%2C%2027%20Apr%202015%2016%3A23%3A49%20%2B0800
host:
将排序后的字符串按顺序⽤\n符号连接起来得到最终结果。
content-length:8
content-md5:NFzcPqhviddjRNnSOGo4rw%3D%3D?
content-type:text%2Fplain
date:Mon%2C%2027%20Apr%202015%2016%3A23%3A49%20%2B0800
host:
这时候认证字符串的signedHeaders内容应该是
content-length;content-md5;content-type;date;host
3.3 ⽣成SigningKey
SigningKey = HMAC-SHA256-HEX(sk, authStringPrefix),其中:
sk为⽤户的Secret Access Key,可以通过在控制台中进⾏查询,关于SK的获取⽅法,请参看获取AK/SK。
authStringPrefix代表认证字符串的前缀部分,即:auth-v1/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}。
3.4 ⽣成Signature
Signature = HMAC-SHA256-HEX(SigningKey, CanonicalRequest)
3.5 ⽣成认证字符串
认证字符串 = auth-v1/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}/{signedHeaders}/{signature}
timestamp:签名⽣效UTC时间,格式为yyyy-mm-ddThh:mm:ssZ,例如:2015-04-27T08:23:49Z,默认值为当前时间。(为实现⽅便,直接使⽤时间戳!!)
expirationPeriodInSeconds:签名有效期限,从timestamp所指定的时间开始计算,时间为秒,默认值为1800秒(30)分钟。
signedHeaders:签名算法中涉及到的HTTP头域列表。HTTP头域名字⼀律要求⼩写且头域名字之间⽤分号(;)分隔,如host;range;x-bce-date。列表按照字典序排列。当signedHeaders为空时表⽰取默认值。
标签:UriEncode,aksk,认证,content,云侧,text,字符串,鉴权