3

我在 node.js (w/ Express) 中构建了一个 API,它目前支持 OAuth 2.0 服务器端(显式)身份验证。我想允许客户端通过 javascript 库(客户端隐式身份验证)连接到应用程序。

首先,我知道我需要在我的服务器上启用 CORS

我目前对隐式身份验证问题的理解是,我们不能要求 javascript 客户端在请求中包含 3rd 方应用程序的秘密,因为这将涉及将秘密编码到 javascript 中,这将是一个安全风险(暴露密钥)。因此,从 javascript 客户端发出的请求仅使用应用程序令牌(并且没有秘密)进行签名。为了保证 API 端的安全性,我们必须将服务于 javacsript 的域与它声称代表的第 3 方应用程序的注册域进行匹配。

换句话说,在 API 端,这个过程听起来像这样:

  1. 如果传入的请求缺少第 3 方应用程序的“秘密”,请检查请求标头
  2. 如果标头确认请求是代表针对此第 3 方应用程序注册的域名发出的,则认为应用程序已验证(并继续验证 access_token,如果提供)。

我的困惑是这样的:

请求标头不能被欺骗吗?我如何确定发出请求的 javascript 客户端确实位于它声称的域上?

4

1 回答 1

3

您应该能够信任浏览器以防止客户端更改您在标题中找到的引荐来源信息。在这种情况下,大多数 api 都会很乐意检查引荐来源网址。

这可以通过让您的服务器为客户端提供一个快速过期的令牌来改进。令牌使用不公开的秘密。

3rd party server asks for token using shared secret to your server
3rd party server serves token to its client
client makes request to your server providing referrer (assured by browser), and token
your server verifies both before replying

当然,如果有人使用命令行工具、浏览器扩展程序或服务器,他们将更容易在请求中发送他们想要的任何内容,但他们只有令牌过期的窗口,而你如果您觉得客户端 IP 滥用服务,可以始终禁止该 IP 地址。

于 2013-03-13T09:39:08.413 回答