过去几天我一直在玩弄一个简单的应用程序想法,因为我正在尝试自学 REST 身份验证的基础知识。
到目前为止,我认为最好的方法是使用 HMAC 的实现,就像亚马逊使用的那样。
我最关心的是我到底应该如何验证用户 和 给他们私钥,以便他们可以开始签署 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> }
然后客户端会将该 key 存储在某个地方(本地存储/cookie 会是一个安全的地方吗?)并使用它来签署看起来像这样的进一步请求
GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key}
然后服务器将检查公钥,检索关联的私钥并重建 HMAC 签名,如果它们匹配,我们有一个经过身份验证的请求处理它。
我做对了吗?如果我仍然需要像我的示例中那样的密码,我不确定我是否理解私钥的作用,所以有些东西告诉我我可能错了。
最佳答案
我认为您需要提供有关您的应用程序及其使用方式的更多详细信息。
您可以通过多种方式进行 REST 身份验证。其中一些是标准的,一些不是。
这些只是一些例子:
如果是 Amazon S3,他们会在您注册时为您提供“AWS secret 访问 key ”。稍后您的应用程序代码需要知道 key 才能计算签名(或者它需要知道签名的请求/url)
因此,最终“ secret 访问 key ”最初在注册期间至少通过网络传输一次。
如果您使用公钥加密(如客户端 SSL 证书) - 您可以完全避免传输私钥
如果您的目标是在用户在登录页面上进行身份验证后仅对向您的站点发出的 AJAX 请求进行身份验证 - 您可以简单地使用服务器签名的 cookie。
关于web-services - REST 身份验证和 HMAC/私钥(我什么时候设置?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386132/