如何在同一个项目Node.js中将一个GAE服务列入另一个白名单

Posted

技术标签:

【中文标题】如何在同一个项目Node.js中将一个GAE服务列入另一个白名单【英文标题】:How to whitelist one GAE service on another within the same project Node.js 【发布时间】:2021-04-13 16:01:37 【问题描述】:

我有两台服务器。第一个是使用 Apollo Server 的后端,另一个是我使用 Next.js 的前端服务器

后端托管在 api.example.com,前端托管在 www.example.com。两台服务器在 Google App Engine 上作为同一应用中的两种不同服务运行。

我遇到的问题是我使用 graphql-query-complexity 来对我的应用程序应用速率限制,并且它也是我的前端服务器的速率限制,因为前端服务器正在使用服务器端渲染来预加载请求数据。

我的问题是:如何将我的前端服务器列入白名单,以便它可以根据需要发出尽可能多的请求,而无需每次在前端将新代码推送到生产环境时手动更新环境变量和服务器 IP 地址服务器?我也不确定我对后端的前端请求是使用本地网络还是使用 www?

这是与我的服务器速率限制相关的代码:

if (config.NODE_ENV !== 'test') 
        // If the cost of the query is more than 500 throw an error
        if (cost > 500) 
          throw new Error(`Query cost exceeds single request token limit. The limit is 500 tokens and the query has a cost of $cost tokens. Please reduce the query cost and try again.`);
        

        // Ensure that the IP Address is present on the request
        if (context && context.req && context.req.connection && context.req.connection.remoteAddress && context.req.connection.remoteAddress !== ---- not sure what to do about this ----) 
          // Check if there is a token allotment already in the database for that IP Address
          const tokens = await redis.get(context.req.connection.remoteAddress);

          console.log(tokens, cost);

          if (tokens !== null) 
            // If the request would exceed the token allotment
            if (tokens - cost < 0) 
              throw new Error('This request would exceed your token allotment. Please reduce the query cost or wait one minute and try again.');
            
            // Decrement the token allotmetment by the cost of the query
            await redis.decrby(context.req.connection.remoteAddress, cost);
           else 
            // Set the value and time-to-live of the token allotment
            await redis.setex(context.req.connection.remoteAddress, 60, 5000 - cost);
          
         else 
          throw new Error('An error occured within the request cost calculator. Please try again.');
        
      

【问题讨论】:

【参考方案1】:

您可以检查标题X-Appengine-Inbound-Appid。当您在服务/项目之间发出 http 请求时,App 引擎会自动添加它(注意:您必须将请求发送到该服务的 appspot.com url)。

https://cloud.google.com/appengine/docs/standard/python/appidentity/#asserting_identity_to_other_app_engine_apps

【讨论】:

以上是关于如何在同一个项目Node.js中将一个GAE服务列入另一个白名单的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 中 GAE 基本扩展的并发性

GraphQL 如何在 node.js 中将服务器错误与客户端错误(最好使用 TryCatch 块)分开?

在visual studio node.js项目中使用socket.io

如何在使用 mysql npm 的查询中将 *array of objects* 从 MySQL 返回到 Node js 服务器?

如何在 Node.js 中将字符串转换为字节数组?

如何在 node.js 中将位字符串转换为 base64?