5

这篇文章是How to do OAuth-requiring operations in a GAE Task Queue?的后续。正如在这个岗位bossylobster建议,我曾尝试硬编码user_id在我的剧本,但cron的任务总是失败:如何在GAE cron作业中执行OAuth-需要的操作?

  • 我可以看到它被触发在日志...

    2013-05-31 14:20:00.879 /update 302 5ms 0kb AppEngine-Google; (+http://code.google.com/appengine) 
    0.1.0.1 - - [31/May/2013:11:20:00 -0700] "GET /update HTTP/1.1" 302 385 - "AppEngine-Google; (+http://code.google.com/appengine)" "myapp.appspot.com" ms=6 cpu_ms=0 cpm_usd=0.000043 queue_name=__cron task_name=... app_engine_release=1.8.0 instance=... 
    
  • ...但是,它总是失败(显示为红色在AppEngine上的Cron作业节“失败”),任务队列它应该永远不会运行在任务队列部分弹出。

我不明白的是,如果我手动打开/update,我的登录提示如下。 cron应该如何绕过?我该如何调试正在发生的事情?

GAE login prompt

感谢您的帮助。

编辑/后随上@dlebech答案:这个问题在app.yaml添加login: admin行有关url后仍然存在。本地(通过登录的管理员权限和访问处理程序的网址在浏览器中Securing URLs for Cron提到的)一切顺利,但是当我部署我的应用程序一直无法OAuth2装饰:

  • 少数调试print语句...

    import webapp2 
    ... 
    
    YOUTUBE_RW_SCOPE = "https://www.googleapis.com/auth/youtube" 
    YOUTUBE_API_SERVICE_NAME = "youtube" 
    YOUTUBE_API_VERSION = "v3" 
    print "Building youtube object" 
    print "Built youtube object" 
    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION) 
    print "Building decorator object" 
    decorator = OAuth2DecoratorFromClientSecrets(CLIENT_SECRETS, YOUTUBE_RW_SCOPE) 
    print "Built decorator object" 
    ... 
    
    class FetchHandlerPage(webapp2.RequestHandler): 
        print "Entering FetchHandlerPage" 
    
        @decorator.oauth_required 
        def get(self): 
         print "Entering FetchHandlerPage:get" 
         gae_user_id = USER_ID 
         query_string = urlencode({'user_id': gae_user_id}) 
         taskqueue.add(url='/fetchworker?' + query_string, method='GET') 
    
  • ...这里是我在我的GAE日志部署后,看到(日志停在最后一行,什么都不会发生下一个):

    2013-05-31 16:12:02.765 /fetch 302 1746ms 0kb AppEngine-Google; (+http://code.google.com/appengine) 
    0.1.0.1 - - [31/May/2013:13:12:02 -0700] "GET /fetch HTTP/1.1" 302 385 - "AppEngine-Google; (+http://code.google.com/appengine)" "myapp.appspot.com" ms=1747 cpu_ms=844 cpm_usd=0.000070 queue_name=__cron task_name=... loading_request=1 app_engine_release=1.8.0 instance=... 
    I 2013-05-31 16:12:02.444 URL being requested: https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest?userIp=0.1.0.1 
    E 2013-05-31 16:12:02.764 Building youtube object 
    E 2013-05-31 16:12:02.764 Built youtube object 
    E 2013-05-31 16:12:02.764 Building decorator object 
    E 2013-05-31 16:12:02.764 Built decorator object 
    E 2013-05-31 16:12:02.764 End static variables 
    E 2013-05-31 16:12:02.764 Entering FetchHandlerPage 
    I 2013-05-31 16:12:02.765 This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This requ 
    

回答

4

怎样的cron应该绕过?

确保cron的URL配置了login: adminlogin: required。 Cron作业“自动通过登录提示”。有关更多信息,请参阅the documentation

如何调试发生了什么?

由于cron作业是由GET请求特定的URL开始,你应该能够只是让一个GET请求到URL调试工作,要么看到开发服务器做什么错误或看到什么在GET请求的日志中。

+0

嗨,感谢您指向'login:admin',我不明白它有这种效果。可悲的是,问题仍然存在(或者也许是另一个?我不确定: - /)。我在@dlebech答案**部分添加了一个**编辑/跟进到我原来的帖子,您怎么看? –

+0

为什么你仍然需要oauth_required装饰器? – dragonx

+0

@dragonx @dragonx我的应用创建了YouTube播放列表,它需要通过[OAuth2舞蹈](https://developers.google.com/youtube/v3/guides/authentication#OAuth2_Flows),而这个装饰器似乎是推荐/最简单的方法去。我错了吗? –