设计 + Omniauth + Facebook

Posted

技术标签:

【中文标题】设计 + Omniauth + Facebook【英文标题】:Devise + Omniauth + Facebook 【发布时间】:2014-05-23 09:43:39 【问题描述】:

我已按照 railscasts 视频 #235 和 #236 设置带有设计的 OmniAuth。我可以让一切正常工作,当我在身份验证控制器中添加条件语句时,我的问题就出现了。我收到以下错误:

AuthenticationsController#facebook 中的 NoMethodError :user:Symbol 的未定义方法“to_key” 它似乎在:

sign_in_and_redirect(:user, authentication.user)

我在这里检查了其他答案,但似乎没有一个解决方案。我找到了一个与 Heroku 相关的,但我正在开发中收到此消息。任何帮助将不胜感激。

authentications_controller.rb

脸书 omn​​iauth = request.env["omniauth.auth"] 身份验证 = Authentication.find_by_provider_and_uid(omniauth.provider,omniauth.uid) 如果认证 flash[:notice] = "登录成功。" sign_in_and_redirect(:user, authentication.user) elsif 当前用户 current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid']) flash[:notice] = "认证成功。" redirect_to authentications_url 别的 @user = User.new @user.apply_omniauth(omniauth) 如果@user.save flash[:notice] = "登录成功。" 登录和重定向(:用户,@用户) 别的 session[:omniauth] = omniauth.except('extra') 重定向到新用户注册网址 结尾 结尾 结束

registrations_controller.rb

类 RegistrationsController 设计::RegistrationsController 定义创建 极好的 session[:omniauth] = nil 除非@user.new_record? 结尾 私人的 def build_resource(*args) 极好的 如果会话[:omniauth] @user.apply_omniauth(会话[:omniauth]) @user.valid? 结尾 结尾 结尾

routes.rb

资源:身份验证 获取 '/auth/:provider/callback' => 'authentications#facebook' devise_for :users, :controllers => :registrations => 'registrations', :omniauth_callbacks => 'authentications'

用户.rb

类用户 ActiveRecord::Base has_many:身份验证 # 包括默认设计模块。其他可用的有: # :confirmable, :lockable, :timeoutable 和 :omniauthable 设计:database_authenticable,:可注册, :recoverable, :rememberable, :trackable, :validatable, :omniauthable def apply_omniauth(omniauth) self.email = omniauth.info.email 如果 email.blank? authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid']) 结尾 def password_required? (authentications.empty?|| !password.blank?) && super 结尾 结尾

日志

ActiveRecord::SchemaMigration 负载 (0.9ms) SELECT "schema_migrations".* FROM "schema_migrations" 我,[2014-04-09T20:17:07.296969 #2248] 信息——omniauth:(facebook)请求阶段已启动。 我,[2014-04-09T20:17:07.353447 #2248] 信息——omniauth:(facebook)请求阶段已启动。 我,[2014-04-09T20:17:07.518464 #2248] 信息——omniauth:(facebook)回调阶段已启动。 AuthenticationsController#facebook 处理为 html 参数: “代码”=> “AQC6I3SgbGI86ZBptFdBal5HIE1UHwCt7Zw5FVzGvWtApGhZfxjmXTo-AX3qJGOA_PWOeMK4i05K2yJL4_8bQLaTUjyvOBO4nQHjz2nLv5CTCMg2fPAsveUquO-UdVA8XajfUai9AQ8U8m4tfkwxysnq4n2bGBot2UCmFcfRGDB_b9uoIO8ELj80ltc3T0Vf2wj6XScl_R5m1o3CTUYqUzLQCukyjCb3Mz5_2_cWvHiCJLEiTMWjwccbrqNFhWgFCDNE0sLWZnESFNbdWUvFb_ug0NoXk4JevtQjv9XbW-FBiZ3FACn49grGlum1Z0I6qbI”, “状态”=> “758f521ee2e37251f404435d13e5f194fc7dab59cb412659” 身份验证负载 (2.2ms) SELECT "authentications".* FROM "authentications" WHERE "authentications"."provider" = 'facebook' AND "authentications"."uid" = '578621157' ORDER BY "authentications"."id" ASC限制 1 用户负载 (7.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 3]] 在 124 毫秒内完成 500 内部服务器错误 渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (2.3ms) 渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.2ms) 渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.9ms) 在救援/布局中渲染 /Users/csmears/.rvm/gems/ruby-1.9.3-p545/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb (35.6ms)

【问题讨论】:

我还查看了设计和omniauth 文档,但似乎找不到解决方案。 【参考方案1】:

问题在于哈希格式。我改了:

sign_in_and_redirect(:user, authentication.user.user_id)

这样就解决了。

【讨论】:

【参考方案2】:

改变

sign_in_and_redirect(:user, authentication.user)

sign_in_and_redirect(authentication.user)

【讨论】:

更改导致新错误:AuthenticationsController#facebook 中的 RuntimeError 找不到 nil 的有效映射 你能分享为这个错误生成的服务器日志吗?将其发布在问题中。

以上是关于设计 + Omniauth + Facebook的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 设计/Omniauth - 无方法错误配置

使用omniauth-facebook“无效凭据”进行设计

Rails Oauth 设计 Omniauth

在 Rails 3 中设置环境变量(设计 + Omniauth)

Ruby on rails omniauth-twitter 和设计

设计Facebook参数app_id是必需的