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

时间:2017-01-11 16:49:32

标签: javascript node.js rest express

我有一个拥有REST api的应用。我想要它,以便可以对REST API进行的唯一请求是源自应用程序本身的请求。我怎样才能做到这一点? 我也在使用node.js + express服务器。

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

3 个答案:

答案 0 :(得分:4)

只需在您的请求中定义标头,它的作用是什么,它只允许来自某个域的请求,并立即拒绝任何其他域。

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

编辑:如果你真的喜欢网络抓取,你可以做一个功能来仔细检查客户的来源。

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:为了支持我的说法,它也适用于Express,我在他们的文档中找到了这个引用;

  

req(request)和res(响应)是Node提供的完全相同的对象,因此您可以调用req.pipe(),req.on('data',callback)以及其他任何事情。表达参与。

答案 1 :(得分:0)

我建议使用客户端的API密钥。 CORS过滤器太容易规避。

答案 2 :(得分:0)

保护How to implement a secure REST API with node.js

的简单方法

以上帖子概述:

  

因为用户可以创建资源(也就是POST / PUT操作),所以您需要保护您的API。您可以使用oauth或者您可以构建自己的解决方案,但请记住,如果密码很容易被发现,所有解决方案都可能被破坏。基本思想是使用用户名,密码和令牌(即apitoken)对用户进行身份验证。可以使用node-uuid生成此apitoken,并且可以使用pbkdf2对密码进行哈希处理

     

然后,您需要在某处保存会话。如果将其保存在普通对象的内存中,如果您终止服务器并再次重新启动它,会话将被销毁。此外,这不可扩展。如果您使用haproxy在计算机之间进行负载平衡,或者您只是使用工作程序,则此会话状态将存储在单个进程中,因此如果同一用户被重定向到另一个进程/计算机,则需要再次进行身份验证。因此,您需要将会话存储在一个公共位置。这通常使用redis完成。

     

当用户通过身份验证(用户名+密码+ apitoken)时,会为会话生成另一个令牌,即accessstoken。再次,使用node-uuid。向用户发送accesstoken和userid。用户ID(密钥)和accessstoken(值)以redis存储,并且过期时间,例如, 1H。

     

现在,每次用户使用其余的api进行任何操作时,都需要发送用户ID和accessstoken。