使用客户端令牌保护REST API调用

3
我有一个node.js REST API,我想将POST/PUT/DELETE调用限制在预定义的“来源”列表中(这些是我不拥有代码的Web应用程序)。
实现这一目标的唯一方法似乎是在客户端上放置一个令牌(类似于JS文件中的Google Analytics),但我不知道如何保护它,因为令牌将在静态文件中可访问。
我应该使用什么策略?JWT和OAuth2似乎不适用,因为它需要首先进行用户身份验证,但我要验证的不是用户,而是Web应用程序。
3个回答

0

你的问题稍微有点不清楚。可能是指(a)你想强烈鼓励用户使用应用程序并防止其他代码恶意让您的用户执行操作,或者(b)您想完全防止用户使用其他代码访问您的服务器。

第一个选项是可能的,确实是一个非常好的主意。根据互联网的工作方式,第二个选择是不可能的。

首先是不可能性。基本上,客户端代码存在是为了让客户端更轻松地完成工作。实际工作将始终在服务器端完成--即使这仅意味着验证数据并将其存储在数据库中。您的客户端将始终能够看到他们发送的所有HTTP请求:这就是HTTP的工作方式。您无法向他们隐藏信息。即使您动态生成令牌(请参见下文),也无法防止他们在其他地方使用它们。他们总是可以构建自定义的HTTP请求,这最终意味着,如果他们真的,真的想这么做,他们可以完全放弃您的应用程序。将客户端代码视为使他们更轻松地执行HTTP请求的工具,并放弃任何防止他们“做错”的想法!

更好的选择是CSRF保护,它为您的服务器和客户端提供了最佳的保护。这意味着在客户端首次登录时发送一个生成的令牌,并在每个请求发送时验证它(通过查找或解密)。这是JWT的基础,它是一个相当古老的验证系统的美妙实现。

0
最终你的API是公开的,因为任何随机的网站访问者都必须能够与API进行交互。即使你使用令牌来限制访问,这些令牌的定义也必须是公开的。即使定期过期和更新令牌(例如通过后端API或包括一种nonce算法),也无济于事,因为这些新令牌将再次在第三方网站上公开可见,任何人都可以获取一个。
CSRF保护可以在浏览器内避免跨站点滥用,但对于防止某人编写API爬虫程序等目的而言,最终是毫无意义的。
你所能做的最好的事情就是使用令牌来识别你授权访问的个人站点所有者,密切监视你的API使用情况,在你认为看到它们被滥用时使令牌失效,并联系站点所有者以更好地保护他们的令牌(他们也会遇到同样的问题,但至少你有人可以责备)。

-2
你可以使用hmac来保护这个过程: 每个客户端都有一个唯一的公私钥对(例如“公钥”和“私钥”)。
当客户端发送请求时,他必须发送一个随机数+他的用户公钥+使用私钥生成随机数+公钥的hmac。
当服务器处理请求时,服务器根据客户端的公钥检索客户端,获取用户的密钥,然后验证签名。
Client, sample call on /api

var nonce = "randomstring";
var pk    = "aaa";
var sk    = "bbb";

var string = "pk="+pk+"&nonce="+nonce;

var crypto = require('crypto');
var hmac   = crypto.createHmac('sha512', sk).update(string).digest('hex');

// send this payload in your request in get, put, post, ....
var payload = string+"&hmac="+hmac; 

request.post({uri:"website.com/api?"+payload}, ....

Server side, security check

var nonce = req.query.nonce;
var pk    = req.query.pk;
var hmac  = req.query.hmac;

// retrieve user and his sk according to pk
var sk = getUser(pk).sk

// rebuild payload string
var string = "pk="+pk+"&nonce="+nonce;

var crypto = require('crypto');
var hmac_check   = crypto.createHmac('sha512', sk).update(string).digest('hex');

if(hmac_check === hmac) { // request valid }else{ // invalid request }

既然所有这些信息都必须嵌入客户端Javascript中,那么有什么阻止我编写一个爬虫来重新创建这个算法呢?这并不难... - deceze
由于所有信息都嵌入在客户端JavaScript中,因此无法防止网页抓取。所有可以通过浏览器执行的操作也可以通过网络爬虫来执行。 - Daphoque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接