通过 SSL 和 HTTP 基本身份验证的 REST 服务
Posted
技术标签:
【中文标题】通过 SSL 和 HTTP 基本身份验证的 REST 服务【英文标题】:REST service through SSL and HTTP Basic Authentication 【发布时间】:2011-11-08 02:08:31 【问题描述】:在 Securing an API: SSL & HTTP Basic Authentication vs Signature 中,如果 REST 调用是通过 SSL 进行的,HTTP 基本身份验证被认为是保护 REST Web 服务调用的一种充分方法。
但对于使用 Ajax 调用受 SSL 和基本身份验证保护的 REST 服务的不安全客户端页面,此方法似乎仍然无效。
我正在尝试设计一个使用通常方式执行密码重置的应用程序:
-
用户输入用户名并请求“重置密码”电子邮件
用户收到包含可验证令牌的密码重置链接的电子邮件
用户点击链接并(在验证令牌后)输入更新后的密码
根据定义,这些页面不需要需要登录。这个 UI 是否可以使用调用 REST 服务来执行诸如验证令牌、发送电子邮件等操作的 Ajax 来实现?即使这些 REST 服务受到 SSL 和基本身份验证的保护,您调用该服务所需的信息(即应用程序的“用户名”和密码)最多也只能保存在可通过以下方式访问的 cookie 中浏览器。
我知道我错过了一些东西。我只是不知道是什么:-)
【问题讨论】:
【参考方案1】:只要 1 - 3 发生在 SSL 下,数据就可以安全地通过网络传输到服务器(假设您信任证书颁发机构)
在此过程中,浏览器会将这些凭据保存在内存中。您别无选择,只能相信用户是否要输入数据。
是网站代码决定是否在 cookie 中存储信息。
我认为如果 1 - 3 在 SSL 下应该没问题。
【讨论】:
谢谢。我认为我的想法是这样的:如果这是一个 1 页的 ajax 应用程序,那么访问服务器的唯一途径就是调用这些 REST 服务。 REST 服务需要身份验证信息才能信任调用应用程序。 ajax 应用程序如何拥有/使用身份验证信息。不通过浏览器暴露它?任何人都不能直接访问此页面,查看它设置的 cookie 并解除 REST 用户名/密码。然后使用用户名/pass 构建另一个调用 REST 服务的应用程序。 假设我想使用 amazon S3 的基本身份验证方案作为使用基本身份验证通过 SSL 调用我们的 REST 服务的指南:Authorization: "AWS" + " " + AWSAccessKeyID + ":" + Base64(HMAC-SHA1(UTF-8(Date), UTF-8(AWSSecretAccessKey)))
... 如果它是一个 ajax“1 页”应用程序,如何我们是否避免向世界公开“AWSSecretAccessKey”?【参考方案2】:
我不知道你在保护什么,所以我只是抛出一些想法。
如果您(或其他人)无法控制依赖方的根列表,则 SSL 和 TLS 没有意义。我这样说是因为我希望如果您不信任拥有锁钥匙的人,那么您就不会将钱存入他的保险库。因此,如果加载登录页面的用户可以这么说,那么用户/通过 TLS 的门槛很低,绝对足以保护我最喜欢的电影列表。
卡比赞美所有存在的 FSM
【讨论】:
拉面!谢谢。这是重置密码的低门槛。 I似乎Ajax调用REST不适合不需要先登录的应用。 我没有发现使用 AJAX 触发 reset-your-password-token-link 电子邮件的问题。当然,当他们单击电子邮件 proggy 或浏览器中的链接时,它会将他们带到新页面(或无论如何重新加载页面)。我想您担心将 cookie 发送到错误的(坏人)服务器……如果没有大量繁重的工作,您就无法避免这种风险。 AJAX 不是这里的弱点。 谢谢。是的,我关心的主要是工作流程的“第二部分”在他们点击链接之后。如果应用程序的该部分进行 Ajax 调用,则应用程序必须针对 REST 服务对自身进行身份验证,但它如何在不将其暴露给正在查看浏览器的任何人的情况下获取身份验证信息(用户名/密码,即 apikey/sharedsecret)? 登录的验证界面是匿名用户可以访问的地方。 API 不应要求匿名用户无权利用的系统用户通行证——它应该是公开的或不透明的。 Public 是登录 API 的典型代表 - 考虑登录 gmail 的权限 - 如果它受到限制,那么您将如何登录;如果它有一个暴露的用户通过,那会有什么帮助;如果它有一个模糊的用户通行证,他们将授予谁使用秘密用户通行证?匿名用户!以上是关于通过 SSL 和 HTTP 基本身份验证的 REST 服务的主要内容,如果未能解决你的问题,请参考以下文章
基于相互证书的身份验证能否与基于 SSL 的基本身份验证共存,用于同一应用程序中的不同路径?