在过去的几天里,我一直在用一个简单的应用程序想法,因为我正在尝试自学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客户端,将向用户呈现一个传统的登录页面,该页面向API发送POST,如下所示:
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签名,如果匹配,我们将对其进行经过身份验证的请求处理。
我说得对吗?如果我仍然需要像我的例子中那样的密码,我不确定我是否理解私钥的作用,所以有些东西告诉我我可能错了。
答案 0 :(得分:12)
我认为您需要提供有关您的应用程序及其使用方式的更多详细信息。 您可以通过多种方式进行REST身份验证。其中一些是标准的,一些不是。 这些只是一些例子:
如果是Amazon S3,他们会在您注册时为您提供“AWS秘密访问密钥”。稍后您的应用程序代码需要知道密钥才能计算签名(或者它需要知道已签名的请求/ URL) 因此,最初“秘密访问密钥”最初在注册期间至少一次通过网络传输。
如果您使用公钥加密(如客户端SSL证书) - 您可以完全避免传输私钥
如果您的目标是在用户在登录页面上进行身份验证后对您的网站发出的AJAX请求进行身份验证 - 您只需使用服务器签名的Cookie。