【问题标题】:Omniauth - Origin is nilOmniauth - 起源为零
【发布时间】:2011-04-26 15:05:29
【问题描述】:

我在 twitter 上使用 gem。在回调时,检查用户是否存在并创建他或将他发送回主页。
我可能做错了什么,但在我的回调代码中,request.env['omniauth.origin'] 为 nil

我的代码很简单:
whatever.html.erb

<%= link_to image_tag("twitter-connect.png"), "/auth/twitter" %>

routes.rb

match "/auth/:provider/callback" => "sessions#create"

sessions_controller.rb

def create
    auth = request.env["omniauth.auth"]
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
    if !user.email
        redirect_to confirm_path, :notice => "Add your email!"
    else
        redirect_to request.env['omniauth.origin'] || root_url, :notice => "Signed in!"
    end
end

如果我在回调后立即提出 request.env['omniauth.origin'],我会得到一个 nil 对象。

感谢您的帮助!

【问题讨论】:

  • 您使用的是哪个版本的omniauth?
  • 我问是因为,我认为新版本的 omniauth 存在与此相关的问题。
  • 嗨,阿迪亚。我今天早上刚刚更新了 0.2.4,所以是最新版本。
  • 我对 0.2.3 和 0.2.4 有同样的问题。在失败回调中,我没有得到任何omniauth.origin。我也尝试将 ?origin=/foo 附加到我的 /auth/google 链接,但没有成功。

标签: ruby-on-rails omniauth


【解决方案1】:

尝试 0.2.0 版 - 我已经能够让这个版本在 Rails 3.0.9 和 Ruby 1.9.2-p180 上正常工作。

  1. 您上面的行不应该读作

    用户 = auth.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)

  2. 至于omniauth.originnil,见this discussion

【讨论】:

  • 嗨,迈克,谢谢你的指导。关于 1),不确定 => 我正在尝试使用 auth 中的信息查找用户,如果我找不到他,则创建他。
  • 好吧,我的意思是你不能这样做 User.find_by_provider_and_uid 因为 User 模型没有提供者/uid 字段;最后我检查了find_by_* 动态查找器允许您仅指定该特定模型的属性。另一方面,您可以检查当前身份验证是否有关联用户,即if current_user == auth.user。查看我使用的逻辑here;我采取了if current_user &amp;&amp; authentication的方法。
【解决方案2】:

您需要在视图中的链接中手动设置原点。在 Rails 4 中,request.original_url 是最好的方法。

在您的 link_to Twitter 按钮中,您可以手动设置来源:

"/auth/twitter?origin=#{request.original_url}"

然后在您的 SessionsController 中,当您重定向到 request.env['omniauth.origin'] 时,它应该可以正常运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2012-02-11
    • 2018-08-27
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多