App Engine remote_api с OpenID - PullRequest
       13

App Engine remote_api с OpenID

10 голосов
/ 05 июня 2010

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

Полагаю, я что-то упускаю из виду. В настоящее время мой скрипт 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? Я думаю, что подобные проблемы будут встречаться и с Bulloader. Cheers,

Colin

Ответы [ 3 ]

9 голосов
/ 06 июня 2010

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

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

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

Я не смог найти много документации по новой поддержке 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 и федеративным входом в систему, я заметил несколько вещей:

  • Администратор правильно распознается is_current_user_admin () с OpenID
  • Режимы микширования не работают. Если для аутентификации установлено значение «Учетные записи Google», то при вызове create_login_url с federated_identity выдается ошибка NotAllowedError
  • Файл cookie ACSID все еще создается в конце процесса входа в систему, только он приходит из / _ah / openid_verify вместо / _ah / login

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

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

А пока вот хакерский обходной путь:

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

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

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

2 голосов
/ 18 июня 2010

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

...