过去几天我一直在玩弄一个简单的应用程序想法,因为我正在尝试自学 REST 身份验证的基础知识。
到目前为止,我已经收集到最好的方法是使用 HMAC 的实现,就像 Amazon 使用的那样。
我最大的担忧是我究竟应该如何验证用户并给他们他们的私钥,以便他们可以开始签署 HMAC?我一直在读到,用于签署 HMAC 的私钥不应该通过网络发送,但是他们一开始是如何得到它的呢?
我的想法是这样的,但我不确定这是否有效。
用户数据库表:
users (simplified, this would probably be a private key per client app?)
id (their public key?)
username
password?
privatekey
假设一个 HTML/JS 客户端,用户将看到一个传统的登录页面,该页面通过以下方式 POST 到 API:
https://example.com/myapp/api/v1/authenticate.json
POST: username / password
那将返回
404:User not found
200:{ "id" : <id>, "privatekey": <privatekey> }
然后客户端将该密钥存储在某个地方(本地存储/cookie 会是一个安全的地方吗?)并使用它来签署看起来像这样的进一步请求
GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key}
然后服务器将检查公钥,检索相关的私钥并重建 HMAC 签名,如果它们匹配,我们有一个经过身份验证的请求处理它。
我做对了吗?如果我仍然需要像我的示例中那样的密码,我不确定我是否理解私钥的作用,所以有些东西告诉我我可能错了。