保护用于进行 Web Api 调用的 API 密钥

Posted

技术标签:

【中文标题】保护用于进行 Web Api 调用的 API 密钥【英文标题】:Securing API key used to make Web Api call 【发布时间】:2018-08-30 21:57:56 【问题描述】:

我正在做一个 Jquery Ajax web api 调用。该 Api 调用要求我传递 Api 密钥。我已启用 CORS。这是我的通话目前的样子

$.ajax(
  type: "POST",
  url: http://localhost:83/test/example1,
  data:  name: JSON.stringify(myObject), userId: UserId ,
  dataType: "json",               
  headers: 
      'apikey': 'asdfee'
  );

我的问题是如何安全地传递此密钥?我不想直接暴露价值。 请问有什么方向吗?

【问题讨论】:

没有正确的解决方案。任何可能的存储密钥的方式都可以被浏览器读取 = 任何可以访问您浏览器的人都可以读取 我如何安全地传递此密钥您可以使用 SSL 安全地传递密钥,但这只会保护通信。没有办法将该密钥安全地存储在您的代码中,因为它对每个人都是公开可见的。为了保护这样的密钥,通常使用OAuth 的一些风格,尽管这不再是标准化的。基本上这不是安全(句号) 如果您担心这一点,您应该使用 AJAX 发布到服务器上的控制器,然后您的服务器可以安全地发布到需要 API 密钥的 API。 【参考方案1】:

简而言之,您无法在客户端保护密钥。客户端的任何内容都是公开的,任何人都可以查看。

话虽如此,您可以尝试一些方法。

    尽量让任何试图获取您的密钥的人都难以接受。这意味着存储在本地存储中并缩小您的 javascript 代码。这不是 100%,但它会让任何想要获得它的人的生活更加艰难。

    在两者之间引入另一层。我自己也做过类似的事情,这个额外的层是另一个 API。这是您存储密钥的地方,也是您与其他 API 通信的地方。所以基本上你永远不会向客户端公开 API 密钥。您的前端调用这个新 API,而新 API 调用受保护的 API。正如我所说,中间多了一层,但它确实有助于保证密钥的安全。

【讨论】:

同时使用选项 1 和 2

以上是关于保护用于进行 Web Api 调用的 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用 RESTful 服务保护跨域的 API 调用

在 JAX-RS 中使用 API 密钥进行身份验证

在 Vanilla JS 和 Django 中保护 API 密钥的最佳方法

如何使用 API 密钥和秘密保护 Spring Boot API

在 Angular2 中保护 API 密钥

如何在没有弹簧安全的情况下使用 api 密钥保护 rest api