Google App Engine - 保护cron python的url

时间:2016-12-08 12:55:18

标签: python google-app-engine cron decorator

我是谷歌应用引擎的新手。我想要对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 任何其他逻辑或方法将不胜感激。

提前致谢。

1 个答案:

答案 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请求创建和排队的。

来自Securing task handler URLs

  

如果任务执行敏感操作(例如修改数据),则为您   可能希望保护其工作者URL以防止恶意外部   用户直接调用它。您可以阻止用户访问   通过限制对App Engine administrators的访问来限制任务网址。   任务请求本身由App Engine发布,并且可以随时发布   目标受限制的URL。

     

您可以通过将login: admin元素添加到网址来限制网址    app.yaml 文件中的处理程序配置。

如果您还希望阻止对这些URL的手动访问(即仅将其限制为任务队列请求),您可以执行与cron类似的标头检查。标头值列在Reading request headers中。我个人选择X-AppEngine-TaskName