【问题标题】:Consume API with basic authentication using Javascript without exposing key pair在不暴露密钥对的情况下,使用 Javascript 使用基本身份验证来使用 API
【发布时间】:2016-12-10 23:05:35
【问题描述】:

我有一个私有 API,我在其中使用基本身份验证作为我的安全层。现在 API 被我的 iOS 应用程序使用,所以没有人能够看到密钥对。

我现在正在为 Web 创建相同的应用程序,使用 React 和 Javascript,并且需要使用基本身份验证使用相同的 API。

如何在 Javascript 中使用我的 API 密钥对而不向公众公开该密钥对?这样的事情有可能吗?

【问题讨论】:

  • 你给每个用户自己的,或者在他们和 API 之间加入一些东西,比如反向代理

标签: javascript reactjs coffeescript


【解决方案1】:

TL;DR:没有。

如果客户端需要能够直接连接到 API,没有万无一失的方法可以阻止他们发现 API 密钥,因为按照设计,他们必须能够访问它才能将其发送到要求。您可以采取措施对其进行混淆,将其编码存储(但客户端也必须具有解码算法)。

事实上,您的 iOS 应用程序也是如此。有人可以对二进制文件进行逆向工程或拦截请求并查看标头,从而发现 API 密钥。

一种可能的“解决方案”可能是让每个客户获得自己的 API 密钥,无论是临时的还是永久的,以某种方式锁定到他们的帐户/设备/会话以限制重复使用。

【讨论】:

  • 感谢您的明确答复。我正在使用 Firebase 进行用户身份验证,并且想知道是否可以使用 OAuth 对我的 API 进行身份验证。我在这里提出了另一个问题 - stackoverflow.com/questions/38881568/… - 如果有时间进一步指出我正确的方向。
【解决方案2】:

正如@Andrew 所说,这是不可能的,你可以让它更难获得,但它会出现在客户端代码的某个地方,这足以说明你正在暴露它。

如果您对替代方案持开放态度,我建议您对第一个请求使用按用户身份验证,然后对后续请求使用基于令牌的身份验证。该令牌可以是JSON Web Token,这就是我所说的流程:

这是它的工作方式,取自JWT's official documentation

在身份验证中,当用户使用其成功登录时 凭据,将返回一个 JSON Web Token 并且必须保存 本地(通常在本地存储中,但也可以使用 cookie), 而不是在 服务器并返回一个 cookie。

每当用户想要访问受保护的路由或资源时, 用户代理应该发送 JWT,通常在 Authorization 标头中 使用承载模式。标题的内容应该看起来像 以下:

Authorization: Bearer <token>

【讨论】:

  • 感谢您提供明确的答案和我可以做什么的示例。我正在使用 Firebase 进行用户身份验证,并且想知道是否可以使用 OAuth 对我的 API 进行身份验证。我在这里提出了另一个问题 - stackoverflow.com/questions/38881568/… - 如果有时间进一步指出我正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2016-04-23
  • 2019-02-17
  • 1970-01-01
相关资源
最近更新 更多