Механизм приложения remote_api с OpenID

Я недавно попытался переключить свое приложение для механизма приложения на открытое использование, но у меня есть проблема, проходящая проверку подлинности с remote_api. Старый механизм аутентификации для remote_api, кажется, не работает (который имеет смысл) - я добираюсь 'urllib2. HTTPError: Ошибка HTTP 302: Найденный', то, которое я принимаю, является appengine перенаправление меня к открытой странице входа в систему, которую я настроил.

Я предполагаю, что пропускаю что-то довольно очевидное. В настоящее время мой remote_api сценарий имеет следующее в нем -

remote_api_stub.ConfigureRemoteDatastore(app_id=app_id, path='/remote_api', auth_func=auth_func, servername=host, secure=secure)

где auth_func

def auth_func():
  return raw_input('Username:'), getpass.getpass('Password:')

Какие-либо идеи, что я должен предоставить к remote_api? Я предполагаю, что с подобными проблемами встретились бы с bulkloader также.Удачи,

Colin

10
задан hawkett 5 June 2010 в 16:57
поделиться

3 ответа

Это было весело.

Глядя на remote_api, поток для аутентификации выглядит примерно так:

  • Запрос пользователю учетных данных Google
  • Передача учетных данных на https://www.google.com/accounts/ClientLogin
  • Разбор auth токена из тела ответа
  • Передача токена на https://myapp. appspot.com/_ah/login
  • Захватить ACSID cookie, установленный в ответе
  • Передать ACSID cookie в последующих запросах, требующих авторизации

Я не смог найти много документации по новой поддержке OpenID, хотя запись в блоге Ника была информативной.

Вот тестовое приложение, которое я написал, чтобы посмотреть, как все работает:

app.yaml:

handlers:
- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login: admin
- url: /.*
  script: test.py

test.py:

class MainPage(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    if user:
      self.response.out.write("Hi, %s!<hr>admin is %s" % (user.user_id(),
        users.is_current_user_admin()))
    else:
      self.redirect(users.create_login_url('/', None,
        'https://www.google.com/accounts/o8/id'))

Переключая режим авторизации между Google Accounts и Federated Login, я заметил несколько вещей:

  • Пользователи-администраторы правильно распознаются функцией is_current_user_admin() с OpenID
  • Смешивание режимов не работает. При аутентификации, установленной на Google Accounts, вызов create_login_url с federated_identity вызывает ошибку NotAllowedError
  • В конце процесса входа все еще создается ACSID cookie, только он приходит из /_ah/openid_verify вместо /_ah/login

Так что же происходит с remote_api при использовании Federated Login? Если мы используем стандартный appengine_rpc.HttpRpcServer, он послушно следует тому же процессу аутентификации аккаунта Google, описанному вверху, только приложение больше не считает cookie ACSID, возвращенный /_ah/login, действительным, поэтому, поскольку вы все еще не аутентифицированы, вы получаете 302 редирект на страницу входа в OpenID, /_ah/login_required.

Я не знаю, какое здесь правильное решение. Похоже, что для этого потребуется обновление API. Может быть, Ник или кто-то из других гуглеров сможет высказаться.

Пока что вот хакерское решение:

  • Включите Federated Login для вашего приложения
  • Убедитесь, что вы передаете save_cookies=True при вызове remote_api_stub.ConfigureRemoteDatastore для вашего консольного скрипта
  • Попробуйте аутентификацию консоли и получите ошибку 302
  • Войдите как администратор через веб-интерфейс вашего приложения
  • В cookies вашего браузера найдите ACSID cookie для myapp. appspot.com
  • Найдите и отредактируйте ваш локальный файл ~/.appcfg_cookies
  • Замените ACSID cookie для myapp.appspot.com файлом из браузера

В следующий раз, когда вы попытаетесь использовать remote_api, он должен работать без запроса учетных данных. Однако вам придется повторять последние 4 шага каждый раз, когда истекает срок действия cookie. Вы можете изменить срок действия от 1 дня до 2 недель в консоли администратора, чтобы уменьшить раздражение. Удачи!

9
ответ дан 3 December 2019 в 23:11
поделиться

Это определенно проблема ... отметьте свою заинтересованность в том, чтобы Google исправил эту проблему, отметив тикет на http://code.google.com/p/googleappengine/issues/detail?id=3258 и не стесняйтесь добавлять туда любые обходные пути.

В связи с этим мы также признаем, что документы несколько скудны, поэтому я работаю над статьей, которая, надеюсь, восполнит некоторые из этих пробелов ... следите за обновлениями и следите за новостями на http : //code.google.com/appengine/articles

3
ответ дан 3 December 2019 в 23:11
поделиться

Вот обходной путь, который вы можете использовать, пока не будет найдено более постоянное решение.

2
ответ дан 3 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: