【问题标题】:Make an API endpoint private将 API 端点设为私有
【发布时间】:2015-06-09 07:39:10
【问题描述】:

我正在使用 AngularJS、express、nodejs 和 Passportjs 开发一个小型 webApp。我一直在按需在我的 API 上创建端点,但现在我遇到了问题。 我有一个用户无法在需要时调用的端点。当用户在应用程序中执行特定操作时会进行此 API 调用,因此他们可以获得积分。 端点类似于 /api/users/updatePoints ,我不希望使用开发人员工具的用户重新发送呼叫并获得他们不应该获得的积分。 我怎么能做到这一点?我已经想了一天,但我想不出任何合理的东西。

提前谢谢你:)

--编辑-- 最后我刚刚删除了那个 ENDPOINT 并直接在服务器端的数据库中写入。不是我想要的解决方案,但足够好。谢谢!!

【问题讨论】:

  • 为什么不在用户在应用中执行特定操作时设置一个标志,并在调用 updatePoints 路由时检查该标志?
  • 可以做到。如何从我的 /api/users 的 index.js 中访问已在前端设置的 var?我可以在这里查看:“router.post('/updatePoints', auth.isAuthenticated(), controller.updatePoints);”
  • 您可以在post操作中提供查询参数或数据。
  • @Trendy 这种方法的问题是您可以随时复制它,因为这是在前端。因此,用户可以将帖子发送到 API 并在他想要的所有时间发送它并获得他想要的所有积分。谢谢!
  • 这是我不喜欢 SPA 的地方,API 调用无论如何都会暴露出来。同意 Jorge 的观点,将更新点端点放在服务器端是这种方式的最佳方法。无论如何,我仍然更喜欢 MVC 而不是 SPA,jquery 运行良好,所以如果你想要它,你不必提交和重新加载页面

标签: angularjs node.js api express passport.js


【解决方案1】:

现在回答已经太晚了,但我认为这可以帮助某人。

要私有化端点,请通过设置相应的响应标头仅允许您列入白名单的来源,并为所有其他用户发送 403 状态代码(这意味着被禁止,401 表示重试)。

这是一个私有化端点的中间件示例。

module.exports = function (allowedOrigins) {
   const whitelistedOrigins = Array.isArray(allowedOrigins) ? allowedOrigins : [allowedOrigins];
   return function (req, res, next) {
      const origin = req.headers.origin;
      if (whitelistedOrigins.indexOf(origin) > -1) {
         res.setHeader("Access-Control-Allow-Origin", origin);
         next();
      } else {
         res.status(403).json({
           msg: "This is a private Endpoint, Please contact the Admin",
         });
      }
   };
};

这是一个使用示例。

const privatizeEndpoint = require("../customMiddlewares/privatizeEndpoint");

router.post("/someEndpoint", privatizeEndpoint(["http://myprivate.domain.com"]), (req, res) => {
     console.log("Inside Private Endpoint");
});

但是,您的端点仍会公开,但至少它只会提供给您的白名单域。

请注意,即使没有来源的请求也会被阻止(curl 命令或通过 POSTMAN)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2019-08-12
    • 1970-01-01
    • 2018-07-23
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多