Это было весело.
Глядя на remote_api, поток аутентификации выглядит примерно так:
Я не смог найти много документации по новой поддержке 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 из вашего браузера