我有一个App引擎应用+云端点。我在任务队列中配置了一个cron任务来调用其中一个端点。 cron对admin有一个auth-constraint。
所有这些都有效,但是当我将api密钥限制到某些域时,运行cron时出现以下错误:
失败 check_errors { 代码:REFERER_BLOCKED 详细信息:"来自referer的请求< empty>被封锁了。" }
我似乎无法向cron.yaml添加裁判标题
显然,Google App Engine会从IP地址0.1.0.1发出cron请求。
所以我可能允许该ip,但我想通过域而不是i.p来限制api密钥。而且我似乎无法做到这两点
是否有人知道允许cron作业访问受域限制的api密钥的解决方法?
答案 0 :(得分:0)
我找到了解决这个问题的方法:
注意:我看到人们在文档中引用了这个:
“呼叫Google Cloud端点
您无法通过cron作业调用Google Cloud Endpoint。相反,您应该向由应用程序的配置文件或调度文件中指定的处理程序提供服务的目标发出请求。然后该处理程序调用适当的端点类和方法。“
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