我是谷歌应用引擎的新手。我想要对cron的url进行安全限制,以便它不应该直接通过url访问。为此,我已经阅读了文档和一些Q& As([Google app engine: security of cron jobs)。
我实施了此链接中建议的login : admin
解决方案。但我无法实现安全性,因为self.request.headers.get('X-AppEngine-Cron')
总是None
,无论是cron还是直接通过url访问。
所以我不知道请求来自哪里(来自cron或直接访问)
def cron_method(BaseRestHandler):
def check_if_cron(self, *args, **kwargs):
if self.request.headers.get('X-AppEngine-Cron') is None:
logging.info("error-- not cron")
self.UNAUTH = "cron"
self.raise_exception()
else:
return BaseRestHandler(self, *args, **kwargs)
return check_if_cron
我使用自定义处理程序 BaseRestHandler 进行其他身份验证。
@cron_method
def put(self):
logging.info("inside put--")
这是通过类的get方法中的taskqueue调用的。 问题是我没有得到标题 X-AppEngine-Cron 任何其他逻辑或方法将不胜感激。
提前致谢。
答案 0 :(得分:1)
您似乎试图将支票设为装饰器。
但是您的代码显示应用于put()
方法的装饰器,而不是get()
方法 - cron仅在get()
上执行。
你的装饰师也不适合我。不应该将装饰器作为参数作为函数并返回一些本地定义的函数,执行(不返回)作为参数接收的函数?
我建议你回到基础 - 尝试在处理程序本身的get方法中检查标头,并且只有在你完成后才考虑进一步考虑更复杂的更改,例如在装饰器中拉入检查。
更有可能的是,你的装饰师没有工作,而不是GAE的记录,因为它不起作用。保持简单(起初)至少可以帮助您将调查工作指向更好的方向。
试试这个:
def cron_method(handler_method):
def check_if_cron(self, *args, **kwargs):
if self.request.headers.get('X-AppEngine-Cron') is None:
logging.info("error-- not cron")
self.UNAUTH = "cron"
self.raise_exception()
else:
handler_method(self, *args, **kwargs)
return check_if_cron
对于来自任务队列的调用 - 这些请求不再是cron请求,即使任务是由cron请求创建和排队的。
如果任务执行敏感操作(例如修改数据),则为您 可能希望保护其工作者URL以防止恶意外部 用户直接调用它。您可以阻止用户访问 通过限制对App Engine administrators的访问来限制任务网址。 任务请求本身由App Engine发布,并且可以随时发布 目标受限制的URL。
您可以通过将
login: admin
元素添加到网址来限制网址 app.yaml 文件中的处理程序配置。
如果您还希望阻止对这些URL的手动访问(即仅将其限制为任务队列请求),您可以执行与cron类似的标头检查。标头值列在Reading request headers中。我个人选择X-AppEngine-TaskName
。