Я недавно попытался переключить свое приложение для механизма приложения на открытое использование, но у меня есть проблема, проходящая проверку подлинности с 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
Это было весело.
Глядя на remote_api, поток для аутентификации выглядит примерно так:
auth
токена из тела ответа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, я заметил несколько вещей:
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. Может быть, Ник или кто-то из других гуглеров сможет высказаться.
Пока что вот хакерское решение:
В следующий раз, когда вы попытаетесь использовать remote_api, он должен работать без запроса учетных данных. Однако вам придется повторять последние 4 шага каждый раз, когда истекает срок действия cookie. Вы можете изменить срок действия от 1 дня до 2 недель в консоли администратора, чтобы уменьшить раздражение. Удачи!
Это определенно проблема ... отметьте свою заинтересованность в том, чтобы Google исправил эту проблему, отметив тикет на http://code.google.com/p/googleappengine/issues/detail?id=3258 и не стесняйтесь добавлять туда любые обходные пути.
В связи с этим мы также признаем, что документы несколько скудны, поэтому я работаю над статьей, которая, надеюсь, восполнит некоторые из этих пробелов ... следите за обновлениями и следите за новостями на http : //code.google.com/appengine/articles
Вот обходной путь, который вы можете использовать, пока не будет найдено более постоянное решение.