6

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

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

在开发环境中使用的测试应用程序设置的详细信息如下 -

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"

我在我的 secrets.yml 中指定了以下内容

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 的凭据作为

# ==> 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
4

2 回答 2

2

在进一步挖掘问题后,观察到在 url 中指定“www.example.com”时没有发生错误,因此回调起作用了。当在地址栏中指定“example.com”并尝试登录 Facebook 时,登录因上述错误而崩溃。

因此,我通过对 facebook 应用程序的设置进行一些更改来解决上述问题。我不知道这是否是正确的方法,但它奏效了。只是按照第 2 点进行更改并不能解决问题。

变化是:

1)使用“example.com”和“www.example.com”指定“应用程序域”2)启用“客户端 OAuth 登录”为“是”3)使用“ http://example ”指定“有效 OAuth 重定向 URI” .com/users/auth/facebook/callback '和' http://www.example.com/users/auth/facebook/callback '

于 2015-06-30T08:38:11.163 回答
0

好的,所以我假设您有一个没有在 Facebook 上运行的 Web 应用程序,它只是使用 Facebook OAuth 流程来实现登录功能,对吗?如果是这样,您必须在生产环境的应用程序设置中启用“客户端 OAuth 登录”。如果您不这样做,则 Web OAuth 流程将不起作用。请参阅这篇文章:https ://developers.facebook.com/docs/facebook-login/security

于 2015-06-28T21:28:12.257 回答