【问题标题】:Sending secure POST data to RESTful API without authentication无需身份验证即可将安全的 POST 数据发送到 RESTful API
【发布时间】:2016-01-25 10:26:17
【问题描述】:

我正在使用一个 Arduino,我想将数据发送到我的远程或本地 Rails RESTful API。在构建它的前端时,我可以使用设计登录并进行身份验证。但我想知道当您希望第三方设备将数据 POST 到后端时会发生什么?

一种选择可能是使用随机生成的长哈希作为密钥,就像 Twitter 所做的那样(例如客户端密钥和 API 密钥),这当然不安全,但会降低有人将数据轻松发布到另一个帐户的机会。

但是,如果我是对的,数据将通过 http 连接发送,因此很容易被嗅探。发送温度数据没有问题,但如果有人决定发送 RFID ID 和姓名等,这可能是一个漏洞。

如何通过 POST 请求将数据发送到 RESTful Rails 后端 API:

  1. 已通过身份验证?
  2. 安全吗?

【问题讨论】:

    标签: ruby-on-rails api rest devise


    【解决方案1】:
    1. 认证了吗?

    您将需要一个第三方可以呼叫的端点(我们称他为 Zed)。 Zed 使用他的电子邮件地址向该端点发送请求 (POST)。然后,Devise 向 Zed 发送一封电子邮件,其中包含一个包含确认令牌的确认链接。 Zed 单击该链接,打开一个页面,他可以在其中输入密码。一旦输入,他就登录了,并且一个 auth_token 被存储在他的用户 ID 中。随后,他可以使用该 auth_token 通过在 Authorization 标头中传递令牌来发出进一步的请求。 'confirm_token' 被丢弃(您可以将其设置为在给定时间段后自动过期)。

    显然这需要 Zed 手动创建他的帐户并登录。即使您设置了第 3 方“开发人员计划”,您仍然需要这些开发人员注册并为他们生成令牌,以便他们可以将请求传递给您的 api。当然,所有这些都应该通过 https 完成。 Devise 提供了开箱即用的几乎所有这些功能。

    1. 安全吗?

    HTTPS 有助于“嗅探”方面。上面的方法是安全的,因为只有提供他们有权访问的电子邮件帐户的人才能创建帐户并获取令牌,然后他们可以使用这些令牌用于以后的请求。但是,您可以使用手机号码/短信作为第二个因素(谷歌双因素身份验证)。

    1. 没有身份验证 - 嗯,有点

    我能想到的唯一其他选择是您向已知用户颁发“签名密钥”。他们用这个密钥签署(加密)他们的请求。由于密钥应该只有他们知道并且只能由服务器使用匹配的公钥解密,因此可以通过 HTTP 发送数据。如果有人嗅到它,他们几乎肯定无法破解密钥以查看真实数据是什么。他们真正能做的就是模仿请求,并在 DOS 攻击中反复向服务器发送相同的请求。

    但是您仍然需要解决如何验证您将密钥提供给谁的问题 - 即您仍然需要以某种方式验证 Zed 是谁。您是否打算离线执行此操作,然后通过电子邮件发送“验证”个人的私钥?使用 RoR,我仍然建议坚持使用 Devise,因为大部分繁重的工作已经为您完成了。

    【讨论】:

    • 感谢您的详细回复,它回答了我的大部分问题。我想知道的是:1.您描述的设计功能是否已经内置设计(auth_token)?我肯定会让每个人都创建一个帐户并通过设计进行身份验证。 2. 如果 Zed 有 auth_token,任何有他的 id(例如电子邮件/用户名)的人都可以 POST 数据到服务器,对吗? 3. 这可能是一个愚蠢的问题,因为我一直使用设计和 Angular/Rails 作为 API,但是如果我遵循 (1) 选项,数据会通过 https 或 http 的 POST 请求发送吗?
    • 1.是的,正常使用(即用户登录并在他们的浏览器中浏览您的网站)。但要直接访问 api,我建议您添加另一个 gem(例如 OAuth2 gem)。 2. 并非如此,因为您还需要 Zed 的密码才能创建令牌。 3. 这完全取决于服务器 - 您必须在服务器上安装 SSL 证书才能使 HTTPS 正常工作。值得一读以获取有关所有这些内容的更多详细信息:rubyjunky.com/…
    • 2.是的,Zed 会创建它,但令牌将是标准哈希键,对吧?
    • 如果 Zed 想通过 https 将数据 POST 到服务器,证书将如何工作?我的意思是这需要交换一些会话密钥,对吗?这些不是通过 POST 请求交换的,那么它是如何完成的?
    • @ChrisV。是的,令牌是标准哈希键。不,HTTPS 只是服务器和请求者之间的数据加密,与身份验证或授权无关。向服务器添加 SSL 证书(并正确配置)只是确保所有流量都被加密。
    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2017-03-04
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多