NodeJS 阻止除前端之外的任何其他资源的API访问

hwazgwia  于 2023-05-06  发布在  Node.js
关注(0)|答案(5)|浏览(159)

我有一个路由api/v1/track,我想通过给定的跟踪ID发送一些数据(JSON),但我只想发送我的前端请求或我的移动的应用程序的响应,而不是任何其他来自任何地方的请求!
我正在使用Node JS和Express,我实现了一些JWT配置,用于使用令牌对用户进行身份验证,但我不知道如何在没有任何预先创建的令牌的情况下限制此路由的访问

app.get("/track/:ID" , (req , res) => {

    // Block forbidden requests ... 

    // If request is from my specific resource ( Frontend or App ) then : 
    res.json(something)
})

我只是不想让人们使用我的API信息,我还需要在用户被认证发送数据到我的Vue SPA之前
谢谢你

eiee3dmh

eiee3dmh1#

没有一种通用的方法可以将API的使用限制在您自己的网页上。Web上的API是“在Web上”,Web上的任何编程工具都可以访问它。
正如其他人所说,你可以实现CORs保护,但这只会阻止人们在自己的网页中从他们自己的Javascript访问你的API-它不会阻止其他脚本或编程工具(如curl)访问你的API。CORs是一种客户端保护,仅在现代浏览器中强制执行。COR不适用于其他访问API的方式,例如通过脚本或其他编程工具。
这里唯一真实的的解决方案是为所有API请求实现身份验证,然后保护您的服务器免受滥用API的影响。身份验证背后的想法是,在API提供任何结果之前,您需要某种经过身份验证的登录/帐户。为了在您自己的网页中使用,您可能有某种可用于身份验证的登录。
然后,在服务器上,您需要每个API调用来检查登录凭证的存在,例如已验证的登录cookie,已验证的JWT令牌等。
这阻止了仅仅开放使用您的API,但显然人们仍然可以在您的网站上创建帐户,然后使用这些凭据以编程方式使用您的API。控制这种情况的唯一方法是实现服务器端保护,例如速率限制,以防止任何可能影响服务器质量或响应能力的滥用API。
对于像Google这样的地方的API服务器,他们通常会要求您注册某种开发人员帐户,并获得一些API访问凭据,然后您可以使用API。作为其中的一部分,您必须同意他们的服务条款,如果您违反这些服务条款,他们可以撤销您的API凭据。他们还将通过速率限制主动控制您的访问,在某些情况下,还可以控制带宽使用。

ljsrvy3e

ljsrvy3e2#

您可以使用CORS限制对服务器的访问,换句话说,您可以“告诉应用程序可以从哪个URL获得访问权限以及哪些方法”。有很好的文档。在手机上,它只能用于混合应用程序(Cordova/Ionic/Phonegap等),因为它们使用浏览器。

mi7gmzs6

mi7gmzs63#

正如@Marcos Molina的回应中提到的,你必须在你的API中使用CORS设置
找到Express文档here
下面是一个基本的例子,来自于一个随机的人在Github上的项目
*可以替换为所需的前端客户端域
关于CORS here的通用文档

import http from 'http';
import bodyParser from 'body-parser';
import express from 'express';
import logging from './config/logging';
import config from './config/config';
import sampleRoutes from './routes/sample';

const NAMESPACE = 'Server';
const router = express();

// ...

/** Rules of our API */
router.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');

    if (req.method == 'OPTIONS') {
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
        return res.status(200).json({});
    }

    next();
});

/** Routes go here */
router.use('/api/sample', sampleRoutes);

// ...

const httpServer = http.createServer(router);

httpServer.listen(config.server.port, () => logging.info(NAMESPACE, `Server is running ${config.server.hostname}:${config.server.port}`));
huwehgph

huwehgph4#

这是一个问题,我问我自己很多,基本上我所做的是每次我进入一个大公司的网站(易趣,Facebook等...),我打开Chrome devtools网络标签,看看那里发生了什么,并从中得到启发,但很难理解发生了什么(至少对我来说)。我实现的另一个解决方案是,我在我的前端使用了Google reCaptchaV 2(假设你只为POST/PATCH请求调用你的API),所以在我的服务器上,我总是检查reCaptcha令牌是否存在和有效,如果它不是请求被拒绝。

2sbarzqh

2sbarzqh5#

我猜一个选项可能是限制后端只能通过前端的IP请求。例如,如果前端的IP为“1.2.3.4”,则应阻止来自其他IP的所有请求。

相关问题