如何确保只有特定的域可以从您的REST API查询?

我有一个具有REST API的应用程序。 我希望它能够对REST API进行的唯一请求是源自应用程序本身的请求。 我怎样才能做到这一点? 我也使用了一个node.js + express服务器。

编辑:该应用程序完全是一个公共Web应用程序。

只需在请求中定义标题,这是做什么的,它只允许来自特定域的请求,并立即拒绝任何其他域。

 response.set('Access-Control-Allow-Origin', 'domain.tld'); 

编辑:如果你真的热衷于networking抓取的东西,你可以做一个函数来检查客户端的来源。

 function checkOrigin (origin) { if (origin === "your.domain.tld") { return true; } else { return false; } } /* Handling it in response */ if (checkOrigin(response.headers.origin)) { // Let client get the thing from API } else { response.write("Send them error that they're not allowed to use the API"); response.end(); } 

上面的例子应该适用于默认的HTTP / HTTPS模块,如果我没有弄错,也应该用于Express。

编辑2:为了支持我的声明,它也应该为快车,我发现这个报价在他们的文件;

req(request)和res(response)是Node提供的完全相同的对象,所以你可以调用req.pipe(),req.on('data',callback)和其他你不需要Express的东西。

一个简单的方法来保护如何使用node.js实现安全的REST API

从上面的文章概述:

因为用户可以创build资源(aka POST / PUT操作),所以你需要保护你的api。 你可以使用oauth,或者你可以build立你自己的解决scheme,但要记住,如果密码真的很容易被发现,所有的解决scheme都可以被破坏。 基本的想法是使用用户名,密码和令牌来authentication用户,也就是apitoken。 这个apitoken可以使用node-uuid生成,密码可以使用pbkdf2进行散列

然后,您需要将会话保存在某个地方。 如果将它保存在一个普通对象的内存中,如果杀死服务器并重新启动,会话将被破坏。 而且,这不是可扩展的。 如果您使用haproxy在机器之间进行负载平衡,或者只是简单地使用worker,则会话状态将被存储在一个进程中,所以如果同一用户被redirect到另一个进程/机器,则需要重新进行身份validation。 因此,您需要将会话存储在一个普通的地方。 这通常使用redis完成。

当用户通过身份validation(用户名+密码+ apitoken)为会话生成另一个令牌时,又名accesstoken。 再次,使用node-uuid。 发送给用户accesstoken和userid。 userid(key)和accesstoken(value)存储在redis中,并且过期时间,例如1h。

现在,每当用户使用其余的api执行任何操作时,都需要发送用户标识和访问权限。

我会build议使用客户端的API密钥。 CORSfilter很容易规避。