用于客户端 – 服务器通信和安全的api-key

我需要一些build议。 我想build立一个JS应用程序,将在客户端浏览器上运行,并与我的服务器与Ajax通信。 问题是我想给这个客户端一些API密钥,所以我可以在我的服务器上授权。 安全明智的问题,因为只要这个关键是通过ajax调用发送,任何人都可以复制此调用。 我不想问客户端创build一些代理服务器,并“请求”。 我希望它是直接从客户端到我的服务器。 除了通过他的IP或域来validation客户,最佳做法是什么?

你可以使用像JWT的东西。

您创build一个身份validation对象

{ apiKey: asd-dfgdf-e3234, // not even necessary (read on) expires: 12213493434, ip: "xxxx" } 

你用base64对它进行编码,然后用一个私钥(或者服务器上的哈希函数)对它进行签名,然后把签名作为base64string附加到“有效载荷”上。

 eyBhcGk6IDEyMzQ1LTU2Nzc4LCBhcGk6IDEyNy4wLjAuMSB9.Tm90IFNlY3VyZSE= | -------- payload ----------------------------| -- signature -| 

传递给你的客户。 每个请求都发送这个令牌。 它可以被检查和validation是防篡改的(匹配请求的IP没有必要的密钥)。

可悲的是,你只能检查Referer头,并发布允许查阅者白名单的API密钥。

这里的主要问题是Referer完全不安全:可以改变。 也就是说,任何人都可以冒充客户…

AFAIK,关键是你的客户应该能够重新创build他们的API密钥,他们应该这样做,一旦他们意识到有人冒充他们。 他们应该不断重新重新创造,直到坏人停止冒充他们…

尽可能地努力…

一种可能的方法是让不需要的客户端冒充实际的客户端,使用过期的访问令牌

而且,一个好的做法可以是,一个客户每天可以请求数量有限的访问令牌。 如果这些访问令牌有24小时到期时间,并且每个API密钥和每天的访问令牌有3或4个限制,如果许多坏人尝试冒充您的客户之一,那么只有3个可以这样做。

您还可以定义每天访问令牌的限制。 这可能会让事情变得更加困难。

顺便说一句,你可以争辩说,任何人都可以窃取整个访问令牌。 那么,现在是重新生成API密钥并获得新密钥的时候了。 最后,这些坏人会厌倦了让他们的访问令牌失效…

最佳解决scheme

实际上,如果您的API需要安全并且是私人的,就像您在我的答案中对您的某些评论所说的那样,那么在这里没有select: 您需要使用服务器代理方式

我会检查node-oauth2-server以使用OAuth2来保护您的API。