aksk认证javademo_AK-SK鉴权
插件名称类别
名称
描述
属性
服务插件
AK/SK 鉴权
gw-ak_sk_auth
⽤户鉴权
功能描述
配置⾃⼰的AK/SK,或是使⽤⽹关⾃动⽣成的AK/SK,完成认证。
客户端涉及的AK/SK签名以及请求发送的流程概述如下:
(1)构造规范请求。将待发送的请求内容按照与API⽹关后台约定的规则组装,确保客户端签名、API⽹关后台认证时使⽤的请求内容⼀致。
(2)使⽤规范请求和其他信息创建待签字符串。
(3)使⽤AK/SK和待签字符串计算签名。
(4)将⽣成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。
请求参数说明:
参数名
说明
必填
值可能性
参数位置
Authorization-Type鼻涕臭是什么原因
鉴权⽅式
是
AK/SK
Header
Authorization
token值
是
Header
使⽤说明
⼀、构造规范请求
使⽤AK/SK⽅式进⾏签名与认证,⾸先需要规范请求内容,然后再进⾏签名。客户端与API⽹关使⽤相同的请求规范,可以确保同⼀个HTTP请求的前后端得到相同的签名结果,从⽽完成⾝份校验。
HTTP请求规范伪代码如下:
CanonicalRequest =
HTTPRequestMethod + '\n' +
CanonicalURI + '\n' +
CanonicalQueryString + '\n' +
CanonicalHeaders + '\n' +
SignedHeaders + '\n' +
HexEncode(Hash(RequestPayload))
假设 原始请求 如下:
Host:
X-Gateway-Date: 20200605T104456Z
1、HTTPRequestMethod:构造HTTP请求⽅法,以换⾏符结束。
HTTP请求⽅法,如GET、PUT、POST等。
构造⽰例:
GET
2、CanonicalURI:添加规范URI参数,以换⾏符结束。规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。
根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。
注意:
计算签名时,URI必须以“/”结尾。发送请求时,可以不以“/”结尾。
构造⽰例:
GET
/demo/login/
3、CanonicalQueryString:添加规范查询字符串,以换⾏符结束。查询字符串,即查询参数。如果没有查询参数,则为空字符串,即规范后的请求为空⾏。
规范查询字符串需要满⾜以下要求:
根据以下规则对每个参数名和值进⾏URI编码:请勿对RFC 3986定义的任何⾮预留字符进⾏URI编码,这些字符包括:A-Z、a-z、0-9、-、_、.和~。
使⽤%XY对所有⾮预留字符进⾏百分⽐编码,其中X和Y为⼗六进制字符(0-9和A-F)。例如,空格字符必须编码为%20,扩展UTF-8字符必须采⽤“%XY%ZA%BC”格式。
对于每个参数,追加“URI编码的参数名称=URI编码的参数值”。如果没有参数值,则以空字符串代替,但不能省略“=”。
例如以下含有两个参数,其中第⼆个参数parm2的值为空。
parm1=value1&parm2=
按照字符代码以升序顺序对参数名进⾏排序。
例如,以⼤写字母F开头的参数名排在以⼩写字母b开头的参数名之前。
以排序后的第⼀个参数名开始,构造规范查询字符串。
构造⽰例:
GET
/demo/login/
parm1=value1&parm2=
4、CanonicalHeaders:添加规范消息头,以换⾏符结束。规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Gateway-Date,⽤于校验签名时间,格式为ISO8601标准的UTC时间格式:YYYYMMDDTHHMMSSZ。
CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry
1 + …,其中每个请求消息头(CanonicalHeadersEntry )的格式为Lowerca(HeaderName) + ‘:’ + Trimall(HeaderValue) + ‘\n’
将消息头名称转换为⼩写形式,并删除前导空格和尾随空格。
按照字符代码对消息头名称进⾏升序排序。
五花肉炒什么好吃注意:
Lowerca表⽰将所有字符转换为⼩写字母的函数。
Trimall表⽰删除值前后的多余空格的函数。
最后⼀个请求消息头也会携带⼀个换⾏符。叠加规范中CanonicalHeaders⾃⾝携带的换⾏符,因此会出现⼀个空⾏。
例如原始消息头为:
Host: \n
Content-Type: application/json;chart=utf8\n
My-header1: a b c \n
X-Gateway-Date:20200605T104456Z\n
My-Header2: "x y \n
对消息头名称转⼩写,按消息头名称字符代码对消息头排序,将消息头的值去掉前导空格与尾随空格。最终得到规范消息头:
content-type:application/json;chart=utf8\n
host:\n
my-header1:a b c\n
my-header2:"x y\n七年级月考试卷
x-gateway-date:20200605T104456Z\n
构造⽰例:
GET
鸭腿做法/demo/login/
parm1=value1&parm2=
content-type:application/json
host:
x-gateway-date:20200605T104456Z
5、SignedHeaders:添加⽤于签名的消息头声明,以换⾏符结束。⽤于签名的请求消息头列表。通过添加此消息头,向API⽹关告知请求中哪些消息头是签名过程的⼀部分,以及在验证请求时API⽹关可以忽略哪些消息头。X-Gateway-Date必须作为已签名的消息头。
已签名的消息头需要满⾜以下要求:将已签名的消息头名称转换为⼩写形式,按照字符代码对消息头进⾏排序,并使⽤“;”来分隔多个消息头。
SignedHeaders = Lowerca(HeaderName0) + ‘;’ + Lowerca(HeaderName1) + “;” + …
假设有三个消息头参与签名:Content-Type、Host、X-Gateway-Date,签名后消息头将为:
SignedHeaders=content-type;host;x-gateway-date
构造⽰例:
GET
/demo/login/
自由之声
parm1=value1&parm2=
content-type:application/json
host:
x-gateway-date:20200605T104456Z
content-type;host;x-gateway-date
消息头添加到请求的具体⽰例请参考 第四步:添加签名信息到请求头
6、RequestPayload:使⽤SHA 256哈希函数以基于HTTP或HTTPS请求正⽂中的body体,创建哈希
值。请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其中Hash表⽰⽣成消息摘要的函数,当前⽀持SHA-256算法。HexEncode表⽰以⼩写字母形式返回摘要的Ba-16编码的函数。例如,HexEncode(“m”) 返回值为“6d”⽽不是“6D”。输⼊的每⼀个字节都表⽰为两个⼗六进制字符。
计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使⽤空字符串””来计算。
本⽰例为GET⽅法,body体为空。经过哈希处理的body(空字符串)如下:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
构造⽰例:
GET
/demo/login/
parm1=value1&parm2=
content-type:application/json
host:
x-gateway-date:20200605T104456Z
content-type;host;x-gateway-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
⾄此,规范请求构造完成。
7、对构造好的规范请求进⾏哈希处理,算法使⽤SHA 256,与对RequestPayload哈希处理的算法相同。
经过哈希处理的规范请求必须以⼩写⼗六进制字符串形式表⽰。
算法伪代码:
Lowerca(HexEncode(Hash.SHA256(CanonicalRequest)))
经过哈希处理的规范请求⽰例:
1ace9c4e12e4e322a506e3866a6e81e62c8f9ae674aca7966a55b9c6deb6ea00
男子汉宣言⼆、创建待签字符串
对HTTP请求进⾏规范并取得请求的哈希值后,将其与签名算法、签名时间⼀起组成待签名字符串。
StringToSign =
Algorithm + \n +
RequestDateTime + \n +
HashedCanonicalRequestAlgorithm:签名算法,对于SHA 256,算法为HMAC-SHA256。
RequestDateTime:请求时间戳,与请求消息头X-Gateway-Date的值相同,格式为YYYYMMDDTHHMMSSZ。
HashedCanonicalRequest:经过哈希处理的规范请求。
上述例⼦得到的待签字符串为:
HMAC-SHA256
20200605T104456Z
1ace9c4e12e4e322a506e3866a6e81e62c8f9ae674aca7966a55b9c6deb6ea00
三、计算签名第一英文怎么说
将SK(Access Secret Key)和创建的待签字符串作为加密哈希函数的输⼊,计算签名,将⼆进制值转换为⼗六进制表⽰形式。
伪代码如下:
signature = HexEncode(HMAC(Access Secret Key, string to sign))其中HMAC指密钥相关的哈希运算,HexEncode 指转⼗六进制。
Access Secret Key:签名密钥。
我好喜欢你歌曲string to sign:创建的待签字符串。
假设Access Secret Key为 8f8154ff07f7153eea59a2ba44b5fcfe443dba1e4c45f87c549e6a05f699145d,则计算得到的signature 为:
3909cd0042fed21287e64b2436adb10ad12894c9beeb69f932efee872fd589ab
四、添加签名信息到请求头
在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包含在已签名消息头中,主要⽤于⾝份验证。
Authorization Header的伪代码如下:
Authorization: algorithm Access=Access key, SignedHeaders=SignedHeaders, Signature=signature
需要注意的是算法与Access之前 有空格 但没有逗号,但是SignedHeaders与Signature之前需要 使⽤逗号 隔开。
得到的签名消息头为:
HMAC-SHA256 Access=19823ef8f417b489515570c83e3d397f, SignedHeaders=content-type;host;x-gateway-date, Signature=3909cd0042fed21287e64b2436adb10ad12894c9beeb69f932efee872fd589ab
得到签名消息头后,将其增加到原始HTTP请求内容中,请求将被发送给API⽹关,由API⽹关完成⾝份认证。
包含签名信息的完整请求如下: