Ошибка 302 при запуске cron и имени входа: admin в app.yaml в Google App Engine - PullRequest
0 голосов
/ 26 октября 2018

Я добавил логин: Admin в app.yaml как описана документация , но у меня все еще есть 302 ошибки при запуске задачи с помощью cron в google app engine.

У меня есть это app.yaml

runtime: python27 
api_version: 1 
threadsafe: true

handlers:
- url: /.*   
  script: main.app   
  login: admin

И это cron.yaml

cron:
- description: "Dashboard"
  url: /processdate?from=2016-03-01&until=2016-03-31
  schedule: every day 23:46
  timezone: Europe/Madrid

Я получаю эту ошибку

0.1.0.1 - - [26/Oct/2018:00:49:40 +0200] "GET /processdate?from=2016-03-01&until=2016-03-31 HTTP/1.1" 302 355 - "AppEngine-Google; (+http://code.google.com/appengine)" "p20000.appspot.com" ms=74 cpu_ms=12 cpm_usd=3.9674e-8 loading_request=0 instance=00c61b117c78f767097d6896daa1f8967a815c14a94d54578ac19efa9d50a5077d5a app_engine_release=1.9.65 trace_id=3c92edad090b5a57d249bd92be246e58

 httpRequest: {
  status:  302   
 }
 insertId:  "5bd248840005a3aae7fa2111"  
 labels: {
  clone_id:  "00c61b117c78f767097d6896daa1f8967a815c14a94d54578ac19efa9d50a5077d5a"   
 }
 logName:  "projects/p201309/logs/appengine.googleapis.com%2Frequest_log"  
 operation: {
  first:  true   
  id:  "5bd2488400ff047fe69ec5d94d0001657e62692d70682d3230313330390001323031383130323674303033383339000100"   
  last:  true   
  producer:  "appengine.googleapis.com/request_id"   
 }
 protoPayload: {
  @type:  "type.googleapis.com/google.appengine.logging.v1.RequestLog"   
  appEngineRelease:  "1.9.65"   
  appId:  "e~myappname"   
  cost:  3.9674e-8   
  endTime:  "2018-10-25T22:49:40.369327Z"   
  finished:  true   
  first:  true   
  host:  "p200000.appspot.com"   
  httpVersion:  "HTTP/1.1"   
  instanceId:  "00c61b117c78f767097d6896daa1f8967a815c14a94d54578ac19efa9d50a5077d5a"   
  instanceIndex:  -1   
  ip:  "0.1.0.1"   
  latency:  "0.074441s"   
  megaCycles:  "12"   
  method:  "GET"   
  requestId:  "5bd2488400ff047fe69ec5d94d0001657e62692d70682d3230313330390001323031383130323674303033383339000100"   
  resource:  "/processdate?from=2016-03-01&until=2016-03-31"   
  responseSize:  "355"   
  startTime:  "2018-10-25T22:49:40.294886Z"   
  status:  302   
  taskName:  "25ed634cde05b07d9a7906f2161d2b16"   
  taskQueueName:  "__cron"   
  traceId:  "3c92edad090b5a57d249bd92be246e58"   
  traceSampled:  true   
  urlMapEntry:  "main.app"   
  userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"   
  versionId:  "20181026t003839"   
 }
 receiveTimestamp:  "2018-10-25T22:49:40.376251430Z"  
 resource: {
  labels: {
   module_id:  "default"    
   project_id:  "myappname"    
   version_id:  "20181026t003839"    
   zone:  "eu2"    
  }
  type:  "gae_app"   
 }
 timestamp:  "2018-10-25T22:49:40.294886Z"  
 trace:  "projects/myappname/traces/3c92edad090b5a57d249bd92be246e58"  
 traceSampled:  true  
}

Любая идея о том, что может быть проблемой или как ее решить?

У меня нет проблем с запуском этого скрипта на моей локальной машине.

------ ОБНОВЛЕНО БОЛЬШЕ ПРОСТОЕ ПРИЛОЖЕНИЕ ------

Я проверил что-то гораздо более простое.Это работает, когда я запускаю https://myappname.appspot.com/hellocron и http://myappname.appspot.com/hellocron

С этим результатом получается то, что ожидалось.

Но когда я запускаю его с ошибкой cron 302, он возвращается снова

----------- app.yaml

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /hellocron
  script: main.app
  login: admin
  secure: always

----------- cron.yaml

cron:
- description: "hellocron"
  url: /hellocron
  schedule: every day 23:46
  timezone: Europe/Madrid

------------ У меня был тот же результат ошибки

    0.1.0.1 - - [01/Nov/2018:12:29:49 +0100] "GET /hellocron HTTP/1.1" 302 267 - "AppEngine-Google; (+http://code.google.com/appengine)" "myappname.appspot.com" ms=8 cpu_ms=9 cpm_usd=2.9839e-8 loading_request=0 instance=00c61b117cb863320ce80ff59a2b5b4b20ee440529428f43d612baa0e980733727302b27 app_engine_release=1.9.65 trace_id=9b9fa8ad127ad41f7907529c3863a0a9
   {
     httpRequest: {
      status:  302   
     }
     insertId:  "5bdae3ad0004cfe52d64d457"  
     labels: {
      clone_id:  "00c61b117cb863320ce80ff59a2b5b4b20ee440529428f43d612baa0e980733727302b27"   
     }
     logName:  "projects/myappname/logs/appengine.googleapis.com%2Frequest_log"  
     operation: {
      first:  true   
      id:  "5bdae3ad00ff04ac4decaecea60001657e62692d70682d3230313330390001323031383131303174313135363535000100"   
      last:  true   
      producer:  "appengine.googleapis.com/request_id"   
     }
     protoPayload: {
      @type:  "type.googleapis.com/google.appengine.logging.v1.RequestLog"   
      appEngineRelease:  "1.9.65"   
      appId:  "e~myappname"   
      cost:  2.9839e-8   
      endTime:  "2018-11-01T11:29:49.315161Z"   
      finished:  true   
      first:  true   
      host:  "myappname.appspot.com"   
      httpVersion:  "HTTP/1.1"   
      instanceId:  "00c61b117cb863320ce80ff59a2b5b4b20ee440529428f43d612baa0e980733727302b27"   
      instanceIndex:  -1   
      ip:  "0.1.0.1"   
      latency:  "0.008908s"   
      megaCycles:  "9"   
      method:  "GET"   
      requestId:  "5bdae3ad00ff04ac4decaecea60001657e62692d70682d3230313330390001323031383131303174313135363535000100"   
      resource:  "/hellocron"   
      responseSize:  "267"   
      startTime:  "2018-11-01T11:29:49.306253Z"   
      status:  302   
      taskName:  "b0467e8a57f53a8ee2b827ca35db275f"   
      taskQueueName:  "__cron"   
      traceId:  "9b9fa8ad127ad41f7907529c3863a0a9"   
      traceSampled:  true   
      urlMapEntry:  "main.app"   
      userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"   
      versionId:  "20181101t115655"   
     }
     receiveTimestamp:  "2018-11-01T11:29:49.321937019Z"  
     resource: {
      labels: {
       module_id:  "default"    
       project_id:  "myappname"    
       version_id:  "20181101t115655"    
       zone:  "eu2"    
      }
      type:  "gae_app"   
     }
     timestamp:  "2018-11-01T11:29:49.306253Z"  
     trace:  "projects/myappname/traces/9b9fa8ad127ad41f7907529c3863a0a9"  
     traceSampled:  true  
    }

Код для / hellocron в python в основном такой:

decorator = OAuth2DecoratorFromClientSecrets(
    os.path.join(os.path.dirname(__file__), 'client_secrets.json'),
    scope='https://www.googleapis.com/auth/bigquery')

class hellocron (webapp2.RequestHandler):

    @decorator.oauth_required

    def get(self):

        self.response.write('hellocron')  

app = webapp2.WSGIApplication([
    ('/hellocron', hellocron),
    (decorator.callback_path, decorator.callback_handler()) ], debug=True)

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Вы хотите удалить @decorator.oauth_required из кода обработчика URL-адреса cron.

Служба cron не имеет учетных данных пользователя (она не запускается как пользователь), поэтому декоратор будет перенаправлять службу входа в систему - отсюда и ответ 302.Вы должны убедиться в этом, повторив ручную проверку, но из окна браузера в режиме инкогнито.

Для защиты URL-адресов службы cron вы не можете использовать обычную проверку подлинности пользователя по этой причине.,Но вы можете использовать login: admin в файле app.yaml и, если хотите, также проверить заголовок X-Appengine-Cron: true или IP-адрес источника 0.1.0.1, см. Защита URL для cron .

Точно так же вам может необходимо удалить secure: always из соответствующего определения обработчика app.yaml (у меня не включено для моего приложения): я не уверен, что служба cronделает запрос GET, используя http или https.Если он делает это с помощью http, конфигурация secure: always также вызовет перенаправление на URL https.Вы можете легко проверить, верно ли это или нет, следуя моим предыдущим комментариям после того, как вы уронили декоратор.

0 голосов
/ 19 марта 2019

Я хотел опубликовать это решение, так как вчера вырывал свои волосы, пытаясь выяснить, почему мои задания cron GAE продолжали давать сбой, и эта ветка помогла мне точно настроить работающее решение.

Я использую PythonНо идея кажется одинаковой.В моем скрипте cron (то есть на странице, посещенной с помощью логики cron) после успешного выполнения отчета у меня было перенаправление, из-за чего cron сообщал, что в GAE произошел сбой, но логика по-прежнему выполнялась правильно.

Чтобы решить эту проблему, все, что я сделал, это вернул простой HTTP-ответ, чтобы cron считал, что все загружено на страницу правильно, а не перенаправляет или не возвращает HTTP-ответ все вместе.

0 голосов
/ 27 октября 2018

Меня зовут Дэн. Я из облачной поддержки Google.

Как я понял, вы получаете 302 ответа при запуске заданий Cron.У вас есть собственный домен с включенным SSL?Я спрашиваю вас об этом, потому что мы получили этот отчет от некоторых клиентов, которые используют HTTP вместо HTTPS.Запускаете ли вы свое приложение на App Engine?Эта информация поможет мне лучше понять ваш текущий сценарий.

Я буду ждать вашего ответа.

...