2010-08-30 21 views
0

我正在将facebook连接与使用authlogic,facebooker和authlogic_facebook_connect插件的我的应用程序集成。在我用facebook登录后,我被重定向到网站的首页(按照​​我的代码) - 但是网页从未加载! - 它挂起。 看着开发日志,我发现有些东西不断尝试从数据库加载用户。Authlogic找不到用户

它只是继续下去,每次我重新加载development.log(而页面仍然尝试加载)它只是变得更大 - 开发日志底部。

这里是我得到的信息:

  1. 做一些调试,我追踪的问题指具有authlogic坚持用户会话的功能(无PARAMS):

    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 

回答

0

明白了! 在正常的用户注册与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错误,说明持久性标记为空。这样更好,现在我们知道发生了什么。

将位于内供应商的authlogic_facebook_connect插件的validate_by_facebook_connect方法/插件/ 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连接设置。

即使我在authlogic_facebook_connect插件中包含修复,这实际上是一个authlogic问题。


编辑:

  1. 我提交了票, authlogic github page约 这个问题
  2. 我写了一个blog post这个问题,以帮助其他人获得坚持了下来。