App Engine:使用受限制的API密钥调用端点时,从cron作业中清除引用者错误

问题描述:

我有一个App引擎应用+云端点。我在任务队列中配置了一个cron任务来调用其中一个端点。 cron对管理员有一个auth-constraint。App Engine:使用受限制的API密钥调用端点时,从cron作业中清除引用者错误

所有这一切工作,但是当我限制API密钥对特定域,我得到当cron是运行以下错误:

失败 check_errors { 代码:REFERER_BLOCKED 细节:“请求从引用者<空的>被阻止。“ }

它似乎并不像我可以从IP地址0.1.0.1裁判头添加到cron.yaml

显然谷歌App Engine的问题cron的请求。

所以我可能会允许该IP,但我想通过域名不是i.p.限制api密钥。它似乎并不像我可以这样做

有谁知道一个解决方法,允许cron作业访问由域限制的API密钥?

我发现了一个变通方法是:

注:我看到人们在文档中引用此:

“调用谷歌云端点

你不能从一个cron调用谷歌云端点而是应该向由应用程序的配置文件或分派文件中指定的处理程序提供服务的目标发出请求,然后该处理程序调用相应的端点类和方法。

https://cloud.google.com/appengine/docs/standard/java/config/cron#

没有进一步的解释或例子,我可以看到。

但是我可以从cron作业调用我的端点,并且它工作正常,除了api关键约束问题之外。

我在其他提到做servlet映射的帖子上看了几条评论,但没有提供一个例子,所以这里是我找到的解决方法和servlet映射的示例代码。

的Java类

import java.io.IOException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class MyServlet extends HttpServlet { 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
    // call your Endpoint Method here, or whatever you want 
     resp.setContentType("text/plain"); 
     resp.getWriter().println("Hello, world"); 
    } 
} 

的web.xml

<servlet> 
     <servlet-name>cronServlet</servlet-name> 
     <servlet-class>com.example.MyServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>cronServlet</servlet-name> 
     <url-pattern>/cronServlet</url-pattern> 
    </servlet-mapping> 

<security-constraint> 
     <web-resource-collection> 
      <web-resource-name>cronServletConstraint</web-resource-name> 
      <url-pattern>/cronServlet</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>admin</role-name> 
     </auth-constraint> 
    </security-constraint> 

cron.yaml

cron: 
- description: myCron 
    url: /cronServlet 
    schedule: every 12 hours 

https://cloud.google.com/appengine/docs/flexible/java/how-requests-are-handled