web-services - REST 身份验证和 HMAC/私钥(我什么时候设置?)

标签 web-services rest authentication restful-authentication

过去几天我一直在玩弄一个简单的应用程序想法,因为我正在尝试自学 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 身份验证。其中一些是标准的,一些不是。
这些只是一些例子:

  • Basic authentication over SSL
  • Digest authentication
  • 各种 token 认证( OAuth 2SPNEGO 、各种 STS)
  • HMAC
  • 客户端 SSL 证书
  • 签名/加密的 cookie。

  • 如果是 Amazon S3,他们会在您注册时为您提供“AWS secret 访问 key ”。稍后您的应用程序代码需要知道 key 才能计算签名(或者它需要知道签名的请求/url)
    因此,最终“ secret 访问 key ”最初在注册期间至少通过网络传输一次。

    如果您使用公钥加密(如客户端 SSL 证书) - 您可以完全避免传输私钥
  • 您在客户端生成公钥/私钥
  • 向服务器提交公钥(或受信任机构签署的证书)
  • 使用私钥对请求(或随机数)进行签名,服务器使用公钥验证签名。

  • 如果您的目标是在用户在登录页面上进行身份验证后仅对向您的站点发出的 AJAX 请求进行身份验证 - 您可以简单地使用服务器签名的 cookie。

    关于web-services - REST 身份验证和 HMAC/私钥(我什么时候设置?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386132/

    相关文章:

    java - 使用 Java 中的产品 API 开发亚马逊 WS 客户端

    java - 使用 Java Generic SOAPClient (SAAJ) 时抛出异常?

    java - 放心请求不起作用

    php - 我想知道为什么我的登录在 000Webhost 上有效,但在我的系统上尝试时却不起作用

    java - ws 消费者服务地址中的动态属性

    c# - 作为 Web 服务结果的大型复杂对象

    javascript - 如何使用回调函数在 Node js 中返回 api 响应

    json - Spring boot Embedded Tomcat "application/json"post请求限制为10KB

    python - HTTP 错误 401 : Authorization Required while downloading a file from HTTPS website and saving it

    android - googleauthutil.gettoken 超时