Javascript 如何在Heroku生产应用程序中排除Facebook登录故障?

Javascript 如何在Heroku生产应用程序中排除Facebook登录故障?,javascript,facebook,heroku,devise,omniauth,Javascript,Facebook,Heroku,Devise,Omniauth,我很难诊断为什么我的应用程序在开发过程中运行良好的Facebook登录流在部署到Heroku时失败 简言之,流程是这样的:Facebook的内容通过React组件呈现在网站页面上。当Facebook响应登录请求时,它会转到回调控制器/users/auth/Facebook/callback。Deviate omniauth让Deviate知道如何创建注册或会话,我的应用程序中的回调代码会更新视图 以下是heroku日志的相关输出: Started GET "/users/auth/faceboo

我很难诊断为什么我的应用程序在开发过程中运行良好的Facebook登录流在部署到Heroku时失败

简言之,流程是这样的:Facebook的内容通过React组件呈现在网站页面上。当Facebook响应登录请求时,它会转到回调控制器
/users/auth/Facebook/callback
。Deviate omniauth让Deviate知道如何创建注册或会话,我的应用程序中的回调代码会更新视图

以下是heroku日志的相关输出:

Started GET "/users/auth/facebook/callback" for 23.243.29.123 at 2016-04-24 14:38:36 +0000
I, [2016-04-24T14:38:36.279311 #8]  INFO -- omniauth: (facebook) Callback phase initiated.
Processing by Users::OmniauthCallbacksController#facebook as JSON
  User Load (1.3ms)  SELECT  "users".* FROM "users" WHERE "users"."provider" = $1 AND "users"."uid" = $2  ORDER BY "users"."id" ASC LIMIT 1  [["provider", "facebook"], ["uid", "10239847019823470"]]
   (3.2ms)  BEGIN
  User Exists (2.7ms)  SELECT  1 AS one FROM "users" WHERE "users"."username" = 'Fake Name' LIMIT 1
   (3.1ms)  ROLLBACK
Redirected to https://fakeapp.herokuapp.com/users/sign_up
因此,我在其他问题中看到的大部分内容都是正确的:

  • 我正在联系Facebook,FB正在响应,因此提供Facebook_APP_ID和Facebook_SECRET的Heroku配置变量似乎已成功设置

  • Facebook正在向omniauth回调发送用户数据 控制器,所以我在Facebook的白名单中列出了正确的URL 回调URL的数量

  • omniauth控制器似乎已正确启动 正在解析Facebook发送的哈希中的uid和用户名, 并尝试登录用户
  • 然后,将用户持久化到数据库中的尝试将被回滚。我的生产应用程序不是在用户表中创建或更新记录,而是说“用户存在”,并执行回滚。(但数据库中不存在用户。我已经运行了
    heroku运行rails c
    User。all()
    不包括我试图通过Facebook登录的用户。)

    作为比较,以下是我的开发应用程序的“健康”登录:

    Processing by Users::OmniauthCallbacksController#facebook as JSON
      User Load (6.0ms)  SELECT  "users".* FROM "users" WHERE "users"."provider" = $1 AND "users"."uid" = $2  ORDER BY "users"."id" ASC LIMIT 1  [["provider", "facebook"], ["uid", "102983457091284357"]]
       (0.1ms)  BEGIN
      SQL (6.8ms)  UPDATE "users" SET "last_sign_in_at" = $1, "current_sign_in_at" = $2, "sign_in_count" = $3, "updated_at" = $4 WHERE "users"."id" = $5  [["last_sign_in_at", "2016-04-24 13:59:24.953190"], ["current_sign_in_at", "2016-04-25 13:33:48.756553"], ["sign_in_count", 55], ["updated_at", "2016-04-25 13:33:48.758631"], ["id", 8]]
       (5.3ms)  COMMIT
    Completed 200 OK in 23ms (Views: 0.4ms | ActiveRecord: 18.3ms)
    
    这是
    omniauth\u callbacks\u controller.rb

    class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
    
        def facebook
          @user = User.from_omniauth(request.env["omniauth.auth"])
    
          if @user.persisted?
            respond_to do |format|
              format.json do
                sign_in @user
                return render :json => @user
              end
              format.html do
                sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
                set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
              end
            end
          else
    
            session["devise.facebook_data"] = request.env["omniauth.auth"]
            redirect_to new_user_registration_url
          end
    
        end
    end
    
    因此,我不知道是什么导致持久化用户的尝试失败。任何关于导致失败的原因的想法,或者仅仅是关于我如何能够比仅仅通过查看Heroku应用程序日志更好地了解问题的想法,都是非常受欢迎的

      def self.from_omniauth(auth)
        where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
          user.email = auth.info.email
          user.password = Devise.friendly_token[0,20]
          user.username = auth.info.name   # assuming the user model has a name
          user.image = auth.info.image # assuming the user model has an image
        end
      end