一.简述
ak/sk是一种身份认证方式,常用于系统间接口调用时的身份验证,其中ak为Access Key ID,sk为Secret Access Key。客户端和服务端两者会协商保存一份相同的sk,其中sk对外保密。通过使⽤ak/sk加密的方法来验证某个请求的发送者⾝份。客户端在调用服务端接口的时候,会带上ak以及signature(使用sk对内容进行加密后得出的签名)进行请求,在服务端接收到这个请求的时候,首先会根据ak去数据库里面去找到对应的sk,然后使用sk对请求内容进行加密得到一个签名,然后对比客户端传过来的签名和服务端计算的出来的签名是否一致,如果一致则代表身份认证通过,反之则不通过。
二.具体流程
判断用户请求头中是否包含Authorization认证字符串。如果请求头包含认证字符串且符合规定格式要求,则执行下⼀步操作。基于HTTP请求信息,使用基于API网关或自定义的签名算法,生成Signature字符串。使用服务器生成的Signature字符串与用户提供的字符串进行比对,如果内容不⼀致,则认为认证失败,拒绝该请求;如果内容⼀致,则表示认证成功,系统将按照用户的请求内容进行操作。
客户端:
1. 构建http请求(包含 access key);
2. 使⽤请求内容和使⽤secret access key计算的签名(signature);
3. 发送请求到服务端。
服务端:
1. 根据发送的access key 查找数据库得到对应的secret-key;
2. 使用同样的算法将请求内容和 secret-key ⼀起计算签名(signature),与客户端步骤2相同;
3. 对比用户发送的签名和服务端计算的签名,两者相同则认证通过,否则失败。
三.应用实例
设计ak/sk的请求参数:
time:请求时间,时间戳,将会被对应的sk配合成进行加密
request-id:随机数,参与生成签名过程,并作为必须请求头
ak:Access Key ID,参与认证请求头以及签名计算过程
body/param:根据实际请求入参进行取值
sk:Secret Access Key,作为计算最终签名数据的重要参数。
当发送请求时,请求端会带上这几个参数去请求接口,如请求:
curl --location --request GET 'localhost:9195/v4/vpc/get-nat-gateway-attribute?regionID=nm8&natGatewayID=natgw-u4z12jh88f'
--header 'hybrid-date: 20230403T154057Z'
--header 'ctyun-hybrid-request-id: 0y13p5g41hwr'
--header 'Hybrid-Authorization: 470bbc5b-10f5-4d7f-bae6-2275046380b3 Header=hybrid-date;ctyun-hybrid-request-id Signature=ejXRxfQRbpKRzDKd24QV55Bgih4j4iQJVVZdfBa6xLY='