App Engine:使用受限 API 键调用端点时,cron 作业出现空引荐来源错误

App Engine: Empty referrer error from cron Job when calling Endpoint with restricted API key

我有一个 App 引擎应用程序 + 云端点。我在任务 queue 中配置了一个 cron 任务来调用其中一个端点。 cron 有一个 auth-constraint 给管理员。

所有这些都有效,但是当我将 api 密钥限制在某些域时,当 cron 为 运行:

时,我收到以下错误

失败 check_errors{ 代码:REFERER_BLOCKED 详细信息:"Requests from referer <empty> are blocked." }

我好像不能给 cron.yaml

添加裁判 header

显然 Google App Engine 从 IP 地址 0.1.0.1 发出 cron 请求。

所以我可能会允许该 ip,但我想按域而不是 i.p 限制 api 密钥。而且我似乎不能同时做到这两点

有谁知道允许 cron 作业访问受域限制的 api 密钥的解决方法?

我找到了解决此问题的方法:

注意:我看到有人在文档中引用了这个:

“正在调用 Google 云端点

您不能从 cron 作业调用 Google Cloud Endpoint。相反,您应该向目标发出请求,该目标由应用配置文件或调度文件中指定的处理程序提供服务。该处理程序然后调用适当的端点 class 和方法。"

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

没有我能看到的进一步解释或示例。

不过,我可以通过 cron 作业调用我的端点,并且工作正常,除了 api 键约束问题。

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

Java Class

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