作为Web API的新手,我已经能够创建一个简单的WEB API来接收POST数据并将其保存到数据库中。
但现在根据将发布数据的第三方API,他们提供了一些KEY / SECRET。我如何使用这些消费他们的POST?
非常感谢任何理解这一点的帮助。
另外,如何仅限制对特定Thrid方API的WEB API访问。
答案 0 :(得分:1)
HMAC认证 - 为每个客户使用一个密钥,客户和服务器都知道HMAC对消息进行哈希处理。
消息是根据HTTP请求构建的,包括
对于EG: 请求将使用签名HMAC哈希发送到Web服务器
Host: {host}
Timestamp: {timestamp}
Authentication: {username}:{signature}
GET请求:
[HTTPGet] /api/values
User-Agent: Chrome
Host: example.com
Timestamp: Tuesday, July 26, 2016 12:39:46 PM
Authentication: demouser:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=
获取哈希签名
GET\n
Tuesday, July 26, 2016 12:39:46 PM\n
/api/values\n
QUERYString示例:
`[HTTPPost] / api / values?user = demo 用户代理:Chrome 主持人:localhost 内容类型:application / x-www-form-urlencoded 时间戳:2016年7月26日,星期二,12:42:6 PM 身份验证:演示:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw =
获取哈希签名
GET\n
Tuesday, July 26, 2016 12:42:6 PM \n
/api/values\n
user=demo
表单数据和查询字符串必须是相同的顺序才能构建正确的输出。
当请求到达服务器时,实现了一个身份验证过滤器来解析请求以获取信息:HTTP动词,时间戳,uri,表单数据和查询字符串,然后基于这些,我们使用带有秘密的hmac哈希构建签名密钥(哈希密码)在服务器上。密钥是从数据库获取的,带有请求的用户名。
然后服务器将请求的签名与生成的签名进行比较,如果相等,则通过认证,否则失败。
建立签名:
private static string HashSignature(string password, string message)
{
var key = Encoding.UTF8.GetBytes(password.ToUpper());
string hashData;
using (var hmac = new HMACSHA256(key))
{
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
hashData= Convert.ToBase64String(hash);
}
return hashData;
}
要防止重复调用服务器,请使用时间戳约束。