Authlogic не может найти пользователя

Я интегрирую facebook connect с моим приложением, которое использует authlogic, facebooker и плагин authlogic_facebook_connect. После того, как я вхожу в систему через facebook, меня перенаправляют на главную страницу сайта (согласно моему коду), но страница никогда не загружается! - зависает. Глядя на журнал разработки, я вижу, что что-то постоянно пытается загрузить пользователя из базы данных.

Он просто продолжается и продолжается, и каждый раз, когда я перезагружаю development.log (пока страница все еще пытается загрузиться), он становится больше - журнал разработки внизу.

Вот информация, которую я получил:

  1. Выполнив некоторую отладку, я отследил проблему до функции, предназначенной для сохранения сеанса пользователя с authlogic (без параметров):

    UserSession.find

  2. Похоже, Authlogic пытается найти в базе данных пользователя с определенным persistence_token. Глядя прямо на эту запись через консоль - ее токен постоянства равен нулю (это может быть только потому, что следующее, что сделает правильно работающая authlogic, - это установить этот токен persistence_token - хотя не уверен).

Кто-нибудь может мне подсказать?

Спасибо!


[4;36;1mUser Load (0.7ms)[0m   [0;1mSELECT * FROM "users" WHERE ("users"."id" = '4') LIMIT 1[0m
[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."facebook_uid" = 100001121293021) LIMIT 1[0m
[4;36;1mUser Load (0.2ms)[0m   [0;1mSELECT "users".id FROM "users" WHERE ("users"."persistence_token" = 'ddd6b0d160321e55266db847d0b4558e9ed76ab220ef3fce655c24c5d24286d56d728deda76b44741121b0b78e1c266537fbfe00bf01206a393090c5c1f475' AND "users".id <> 4) LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = '4') LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT * FROM "users" WHERE ("users"."facebook_uid" = 100001121293021) LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT "users".id FROM "users" WHERE ("users"."persistence_token" = 'ddd6b0d160321e55266db847d0b4558e9ed76ab220ef3fce655c24c5d24286d56d728deda76b44741121b0b78e1c266537fbfe00bf01206a393090c5c1f475' AND "users".id <> 4) LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT * FROM "users" WHERE ("users"."id" = '4') LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."facebook_uid" = 100001121293021) LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT "users".id FROM "users" WHERE ("users"."persistence_token" = 'ddd6b0d160321e55266db847d0b4558e9ed76ab220ef3fce655c24c5d24286d56d728deda76b44741121b0b78e1c266537fbfe00bf01206a393090c5c1f475' AND "users".id <> 4) LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = '4') LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT * FROM "users" WHERE ("users"."facebook_uid" = 100001121293021) LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT "users".id FROM "users" WHERE ("users"."persistence_token" = 'ddd6b0d160321e55266db847d0b4558e9ed76ab220ef3fce655c24c5d24286d56d728deda76b44741121b0b78e1c266537fbfe00bf01206a393090c5c1f475' AND "users".id <> 4) LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT * FROM "users" WHERE ("users"."id" = '4') LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."facebook_uid" = 100001121293021) LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT "users".id FROM "users" WHERE ("users"."persistence_token" = 'ddd6b0d160321e55266db847d0b4558e9ed76ab220ef3fce655c24c5d24286d56d728deda76b44741121b0b78e1c266537fbfe00bf01206a393090c5c1f475' AND "users".id <> 4) LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = '4') LIMIT 1[0m
[4;36;1mCACHE (0.0ms)[0m   [0;1mSELECT * FROM "users" WHERE ("users"."facebook_uid" = 100001121293021) LIMIT 1[0m
[4;35;1mCACHE (0.0ms)[0m   [0mSELECT "users".id FROM "users" WHERE ("users"."persistence_token" = 'ddd6b0d160321e55266db847d0b4558e9ed76ab220ef3fce655c24c5d24286d56d728deda76b44741121b0b78e1c266537fbfe00bf01206a393090c5c1f475' AND "users".id <> 4) LIMIT 1[0m

person Yuval Karmi    schedule 30.08.2010    source источник


Ответы (1)


Понятно! При обычной регистрации пользователя с помощью authlogic происходит следующее: before_validation: reset_persistence_token,: if =>: reset_persistence_token? Что это значит, устанавливается начальный токен persistence_token, если он пуст

По какой-то причине плагин authlogic_facebook_connect пропускает эту проверку, в результате чего в базу данных отправляется поле NULL persistence_token.

В моей таблице пользователей у меня было поле persistence_token как таковое

t.string :persistence_token

он должен быть определен так, но убедившись, что он не равен нулю:

t.string :persistence_token, :null => false

Теперь вместо того, чтобы вешать браузер, вы получаете сообщение об ошибке sqlite, в котором говорится, что токен постоянства равен нулю. Так лучше, теперь мы знаем, что происходит.

Переходим к методу validate_by_facebook_connect плагина authlogic_facebook_connect, расположенному внутри vendor / plugins / authlogic_facebook_connect / lib / authlogic_facebook_connect / session.rb, где говорится

new_user.send(:"#{facebook_uid_field}=", facebook_session.user.uid)
new_user.send(:"#{facebook_session_key_field}=", facebook_session.session_key)

добавьте еще одну строку, чтобы она гласила:

new_user.send(:"#{facebook_uid_field}=", facebook_session.user.uid)
new_user.send(:"#{facebook_session_key_field}=", facebook_session.session_key)
new_user.reset_persistence_token

Теперь мы убеждаемся, что у нас установлен токен постоянства при первом создании пользователя. сделайте это еще раз, браузер не зависает, пользователь создается, добро пожаловать в рабочую настройку authlogic facebook connect.

Несмотря на то, что я включил исправление в плагин authlogic_facebook_connect, это действительно проблема с аутентификацией.


РЕДАКТИРОВАТЬ:

  1. Я отправил запрос на authlogic страницу github об этой проблеме
  2. Я написал сообщение в блоге о эта проблема, чтобы помочь другим, которые застряли в ней.
person Yuval Karmi    schedule 30.08.2010