2

У нас есть приложение, работающее на Google Appengine (Python 2.7), которое использует Simple Auth для входа и рамки webapps2. В настоящий момент мы поддерживаем только регистрацию в Facebook.Создание сеанса в Google appengine (Python) - простое сбой аутентификации

Задача: Временами создание учетной записи facebook не работает должным образом. Это происходит не всегда, и это влияет только на 10% общего трафика на сайте. Обратный вызов от Facebook auth на наш сайт поступает правильно, мы также можем получить токен Facebook. Но создание сеанса в одиночку терпит неудачу.

Управление потоком: 1) Пользователь нажимает на кнопку «Вход с Facebook» на нашей странице 2) Пользователь перенаправляется на Facebook для разрешений (если его первый раз Войти) 3) Пользователь перенаправляется обратно наш сайт на предоставление правильного разрешения в Facebook 4) Пользовательский токен аутентификации получен на нашем сайте, и мы получаем данные пользователя из API-интерфейса Facebook, используя этот токен 5) Создан сеанс, и заголовок cookie устанавливается на объект ответа (Place где проблема возникает в настоящее время) 6) Пользователь перенаправляется на нашу панель инструментов (панель мониторинга - это экран, который отображается только для зарегистрированных пользователей. Поэтому, если сеанс/файл cookie не создан должным образом, пользователь wil l перенаправить на страницу входа).

Устранение уже пробовало: Мое первое предположение заключалось в том, что создание сеанса занимает больше времени, чем следующая строка кода для выполнения. Это может произойти в случае, если создание сеанса является асинхронным процессом. Поэтому я включил небольшую задержку между строкой создания сеанса и следующей строкой. Идея заключалась в том, чтобы дать достаточно времени для совершения незафиксированных изменений. Кроме того, если сеанс действительно не был создан в конце времени ожидания, я пытаюсь воссоздать объект сеанса.

ok, user = self.auth.store.user_model.create_user(auth_id, **_attrs) 
logging.info("creating user : "+str(ok)+" | user" +str(user)) 
if ok: 
    self.auth.set_session(self.auth.store.user_to_dict(user)) 
    logging.info("User: "+str(self.auth.get_user_by_session())) 
    if(self.auth.get_user_by_session() is None): 
     logging.info("Existing user logging in.. But the set session didn't work So wait for sometime") 
     time.sleep(0.5) 
     if(self.auth.get_user_by_session() is None): 
      logging.info("Existing user logging in.. But the set session didn't work So try again") 
      self.auth.set_session(self.auth.store.user_to_dict(user)) 

Но вышеупомянутая техника не работает. Итак, в моем диагнозе есть недостаток.

Запрашивать справку по решению этой проблемы. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

ответ

0

В целом, ожидание является плохим оправданием для синхронизации.

В любом случае вы захотите вникнуть в свою библиотеку auth для расследования. Вы не хотите, чтобы auth.set_session был асинхронным. Сделайте его синхронным. Это должно облегчить жизнь.

Узнайте, как работает get_user_by_session(). Проблема, которую вы описываете, звучит так же, как возможное поведение последовательности. Это может произойти, если get_user_by_session() выдает операцию запроса хранилища данных, которая может в конечном итоге привести к согласованным результатам. Для вашей операции get_user_by_session() вы хотите получить согласованные результаты, поэтому библиотека должна использовать операцию получения данных. Фактически, поскольку вы только что создали пользователя и сеанс, библиотека должна была кэшировать эту информацию и не должна вообще ударять по хранилищу данных.

Библиотека, являющаяся python, вы должны пройти через код библиотеки и выяснить, что происходит.