Ruby on rails 4 即使在启用';嵌入式浏览器OAuth登录';并指定回调url

Ruby on rails 4 即使在启用';嵌入式浏览器OAuth登录';并指定回调url,ruby-on-rails-4,omniauth-facebook,Ruby On Rails 4,Omniauth Facebook,我有一个rails(4.2.0)应用程序,它使用Facebook登录功能。主要的宝石是Desive(3.4.0)和omniauth facebook(2.0.0)我已在Facebook上注册了该应用程序,并一直在使用其测试应用程序进行开发。Facebook登录功能在开发环境中工作 当尝试在生产服务器上使用facebook登录功能时,我收到的错误是“应用程序配置不允许给定URL:应用程序的设置不允许一个或多个给定URL。它必须与网站URL或画布URL匹配,或者域必须是应用程序域之一的子域。” de

我有一个rails(4.2.0)应用程序,它使用Facebook登录功能。主要的宝石是Desive(3.4.0)和omniauth facebook(2.0.0)我已在Facebook上注册了该应用程序,并一直在使用其测试应用程序进行开发。Facebook登录功能在开发环境中工作

当尝试在生产服务器上使用facebook登录功能时,我收到的错误是“应用程序配置不允许给定URL:应用程序的设置不允许一个或多个给定URL。它必须与网站URL或画布URL匹配,或者域必须是应用程序域之一的子域。”

dev env中使用的测试应用设置的详细信息如下-

Settings:
  Basic:
    App Domains: 'localhost'
    Website:
      Site URL: 'http://localhost:3000'
  Advanced:
    OAuth Settings:
      Embedded browser OAuth Login: Yes
      Valid OAuth redirect URIs: "http://localhost:3000/users/auth/facebook/callback"
Settings:
  Basic:
    App Domains: 'www.mysite.co'
    Website:
      Site URL: 'http://www.mysite.co'
  Advanced:
    OAuth Settings:
      Embedded browser OAuth Login: Yes
      Valid OAuth redirect URIs: "http://www.mysite.co/users/auth/facebook/callback"
生产环境中使用的已注册应用的设置详情如下-

Settings:
  Basic:
    App Domains: 'localhost'
    Website:
      Site URL: 'http://localhost:3000'
  Advanced:
    OAuth Settings:
      Embedded browser OAuth Login: Yes
      Valid OAuth redirect URIs: "http://localhost:3000/users/auth/facebook/callback"
Settings:
  Basic:
    App Domains: 'www.mysite.co'
    Website:
      Site URL: 'http://www.mysite.co'
  Advanced:
    OAuth Settings:
      Embedded browser OAuth Login: Yes
      Valid OAuth redirect URIs: "http://www.mysite.co/users/auth/facebook/callback"
我已经在我的秘密中详细说明了以下内容

development:
  secret_key_base: some_secret_key 
  facebook:
    app_id: test_app_id
    app_secret: test_app_secret
production:
  secret_key_base: some_secret_key 
  facebook:
    app_id: registered_app_id
    app_secret: registered_app_secret
并且一直在使用设计初始化器中secrets.yml的creds作为

# ==> OmniAuth
# Add a new OmniAuth provider. Check the wiki for more information on setting
# up on your models and hooks.
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
require 'omniauth-facebook'
config.omniauth :facebook, Rails.application.secrets.facebook['app_id'], Rails.application.secrets.facebook['app_secret'], scope: ['user_photos', 'email', 'public_profile']

实际域名(变黑)在任何地方都没有拼写错误,在任何地方都是相同的

与omniauth相关的routes.rb的内容如下

 cat config/routes.rb 
Rails.application.routes.draw do
  root 'home#index'

  devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }

  # routes related to other controllers
end
路线如下

bundle exec rake routes | grep user

new_user_session GET      /users/sign_in(.:format)                               devise/sessions#new
user_session POST     /users/sign_in(.:format)                               devise/sessions#create
destroy_user_session DELETE   /users/sign_out(.:format)                              devise/sessions#destroy
user_omniauth_authorize GET|POST /users/auth/:provider(.:format)                        users/omniauth_callbacks#passthru {:provider=>/facebook/}
user_omniauth_callback GET|POST /users/auth/:action/callback(.:format)                 users/omniauth_callbacks#:action
整个应用程序中唯一与omniauth相关的代码如下

$ cat app/controllers/users/omniauth_callbacks_controller.rb 

class Users::OmniauthCallbacksController <  Devise::OmniauthCallbacksController
  def facebook
    #You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(request.env["omniauth.auth"])
    if @user.persisted?
      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?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end
$cat app/controllers/users/omniauth\u callbacks\u controller.rb
类用户::OmniAuthCallbackController<设计::OmniAuthCallbackController
def facebook
#您需要在模型中实现以下方法(例如app/models/user.rb)
@user=user.from_omniauth(request.env[“omniauth.auth”])
如果@user.persistent?
登录并重定向@user,event::authentication#如果未激活@user,将引发此错误
设置flash消息(:注意,:成功,种类:“Facebook”)如果是导航格式?
其他的
会话[“designe.facebook_data”]=request.env[“omniauth.auth”]
将\重定向到新\用户\注册\ url
结束
结束
结束

好的,我假设您有一个web应用程序没有在Facebook上运行,它只是使用Facebook OAuth流来实现登录功能,对吗?如果是这样,则必须在生产环境的应用程序设置中启用“客户端OAuth登录”。如果不这样做,那么web OAuth流将无法工作。请参阅本文:

进一步挖掘该问题后,发现在url中指定“www.example.com”时没有发生错误,因此回调正常工作。当在地址栏中指定'example.com'并尝试facebook登录时,登录失败,出现上述错误

因此,我通过对facebook应用程序中的设置进行一些更改,解决了上述问题。我不知道这是否是正确的方法,但它成功了。仅仅按照第二点所做的改变并不能解决问题

变化如下:

1) 使用“example.com”和“www.example.com”指定了“应用程序域” 2) 已将“客户端OAuth登录”启用为“是”
3) 使用“”和“”指定了“有效的OAuth重定向URI”

“它必须与网站URL或画布URL匹配,或者域必须是应用程序域之一的子域”–您将这些值设置为什么?我在问题中为Facebook的“设置”和“基本”和“高级”选项卡指定了大多数详细信息。您的
路由.rb
看起来像什么?@fyloi更新了问题。在生产和开发中加载
/users/auth/Facebook/callback
时会发生什么?(首先在dev中注销)。