【问题标题】:Recommended method/authentication engine to secure an API推荐的方法/身份验证引擎来保护 API
【发布时间】:2012-01-27 03:54:40
【问题描述】:

您好,感谢您的关注。

背景

我正在设计一个应用程序,它将通过 API 为第三方网站托管某些信息/数据,并且必须通过经过身份验证的请求进行访问。

OAuth 是解决这个问题的方法还是有更好的方法?我不会预先知道第三方网站的域,所以我不能依赖主机头(无论如何都可能被欺骗)。

对 API 的请求很可能来自客户端的 jQuery 或常规 JavaScript。

问题

确保从我的 API 请求数据的第三方网站是他们所说的真实身份并被允许访问他们请求的信息的最佳方法是什么?

非常感谢!

马特

【问题讨论】:

    标签: api oauth openid dotnetopenauth


    【解决方案1】:

    OAuth,尤其是 OAuth 2(尚未最终确定)可能对您很有效。但由于网络请求来自浏览器,而不是托管这些网站的网络服务器,因此每个单独的浏览器都必须获得授权,而不是每个域。

    所以让我们退后一步,问这个问题:

    您的 API 将向每个用户公开的数据是唯一的还是每个网站域唯一的?或者换句话说,您作为 API 所有者是否会通过合同授权 访问您的数据,或者个人用户是否可以通过您的 API 访问数据,并且这些用户需要授权这些其他域访问到他们自己的服务上的数据?

    如果您正在授权域(而不是用户),则浏览器根本无法成为这些对您的 API 的授权请求的发起者。这是因为这些域上的 Web 服务器必须向客户端发布他们的密钥,此时他们已经失去了对它的控制,任何人都可以进行这些授权调用——不仅仅是你打算授权的域。这就是“你不能信任客户”的安全原则。

    如果您正在授权用户,那么访问这些第 3 方网站之一的每个用户都必须进行一次性设置,在该设置中网站将他们的浏览器重定向到您的服务以登录并说“是,[ 3rd 方站点] 可以访问我的数据”,然后将它们重定向回该站点。之后,每当他们访问该站点时,该站点都可以下载该用户独有的密钥,并且可以从客户端上的 javascript 中使用该密钥来进行这些授权的 API 调用。

    【讨论】:

    • 感谢安德鲁的出色意见!数据起初不一定需要以用户为中心,但理想情况下,API 将在未来足够灵活。最终,我想向其他网站(客户)提供某些数据流,并且不需要任何特殊的中间层代码。这是通过他们合并我正在开发的一个 jQuery 插件来实现的,然后将某些属性添加到他们的 HTML 标记中,当在 DOM 加载后解析这些属性时,将触发对数据的 ajax 调用,然后将返回的数据注入 HTML标记。
    • 话虽如此,数据流可能特定于一个特定的站点,所以我不希望其他网站所有者使用特殊的 HTML 属性来调用他们不拥有的数据。希望这是有道理的。再次感谢!
    猜你喜欢
    • 2015-08-08
    • 2016-10-28
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多