【问题标题】:How to accomplish a secure authentication in Javascript API如何在 Javascript API 中完成安全身份验证
【发布时间】:2013-04-07 23:48:10
【问题描述】:

我们正在尝试为我们的服务开发 API,但我们正在怀疑如何完成身份验证过程。我们的客户端必须能够包含一个与我们的 Node.js 服务器连接的 .js 文件。这里的关键点是我们的后端必须跟踪 API 的使用,以便我们的客户将根据其使用收费。

我们的目的是为用户设计尽可能简单的 API,同时确保其安全。我们想到了:

  • 为每个用户创建一个 API_KEY 并在每个请求中将其与他们的域进行匹配。这里的问题可能是域不是最安全的选择,不是吗?我们知道该域可能会在 HTTP 请求中被替换。

  • 使用带有 API_KEY 和 SECRET_KEY 的 SDK 为给定会话和用户生成令牌。我一点也不讨厌这个选项,但我们希望为开发人员提供一个更简单的解决方案,这并不意味着使用多个 API。

你有什么想法/建议/考虑/什么?

提前致谢。

【问题讨论】:

  • 如果“域”是指在 Origin 标头中传递的值,则在支持 CORS 的较新浏览器上这是不可欺骗的。它仍然可以在较旧的浏览器(尤其是 IE)上被欺骗,但这可能是可以接受的,因为单个较新的浏览器请求可能会暴露诡计 - 如果所有用户都在 IE 上,他们只能侥幸逃脱。

标签: javascript api security authentication authorization


【解决方案1】:

我最喜欢你的第二个选项。除了 API_KEY 和 SECRET_KEY 之外,您还可以做许多其他事情。

首先确保所有请求都通过 HTTPs 完成。它是您可以添加的最重要的安全功能……而且操作简单。

其次,如果您想让事情变得超级安全,请从客户端发送时间戳。此时间戳可用于对 SECRET_KEY 进行哈希处理,从而防止有人重新创建数据。

您的客户会随每个请求发送以下内容:

1) 时间戳 - 您可以将其存储在数据库中并拒绝任何具有较小数字的新请求

2) API_KEY - 本质上是一个用户 ID

3) 签名 - 这是 SECRET_KEY、时间戳和 API_KEY 的哈希值。 (散列算法和参数顺序通常不重要。SHA1 相当不错)您的服务器可以计算此散列以验证此客户端实际上知道 SECRET_KEY。您的客户绝不应向任何人透露 SECRET_KEY。

您还可以查看 OAuth 标准。我相信一般来说 NodeJS 和 Javascript 都有它的库。 NodeJS OAuth Provider

【讨论】:

  • 仅在 JavaScript 中交易时是否可以避免将 SECRET_KEY 泄露给任何用户(包括实际用户)?
  • @Sti 只是想知道/希望您现在知道答案!真诚的好奇先生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多