【问题标题】:Authlogic can't find userAuthlogic 找不到用户
【发布时间】:2010-08-30 15:18:08
【问题描述】:

我正在将 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

【问题讨论】:

    标签: ruby-on-rails ruby authentication sqlite authlogic


    【解决方案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 错误,指出持久性令牌为空。好多了,现在我们知道发生了什么。

    转到位于 vendor/plugins/authlogic_facebook_connect/lib/authlogic_facebook_connect/session.rb 内的 authlogic_facebook_connect 插件的 validate_by_facebook_connect 方法,它在其中显示

    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 来帮助其他陷入困境的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多