我有一个使用Facebook登录功能的rails(4.2.0)应用程序。主要的宝石是设计(3.4.0)和omniauth-facebook(2.0.0)。 我已经在Facebook上注册了该应用程序并且一直在使用其测试应用程序进行开发。 Facebook登录功能在开发环境中有效。
当尝试在生产服务器上使用facebook登录功能时,我收到错误“应用程序配置不允许给定URL:应用程序的设置不允许使用一个或多个给定的URL。它必须与网站URL或Canvas URL,或域必须是App域之一的子域。“
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"
我在secretts.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
答案 0 :(得分:2)
我没有足够的声誉来发表评论。您需要在Facebook开发中心更改设置以匹配生产站点的URL而不是localhost。
点击此处更新您的网址:
答案 1 :(得分:2)
在进一步挖掘问题后,观察到当在网址中指定'www.example.com'时错误没有发生,因此回调起作用。当在地址栏中指定'example.com'并尝试登录facebook时,登录崩溃并出现上述错误。
所以,我通过对facebook应用程序的设置进行一些更改来解决上述问题。我不知道如果这是正确的方法,但它确实有效。只是在第2点进行更改并没有解决问题。
变更是:
1)使用'example.com'和'www.example.com'指定'App Domains' 2)启用“客户端OAuth登录”为“是” 3)使用“http://example.com/users/auth/facebook/callback”和“http://www.example.com/users/auth/facebook/callback”
指定“有效的OAuth重定向URI”答案 2 :(得分:0)
好的,所以我假设你有一个不在Facebook上运行的网络应用程序只是使用Facebook OAuth流程来登录功能,对吗?如果是这样,您必须启用&#34;客户端OAuth登录&#34;在生产环境的应用程序设置中。如果您不这样做,那么网络OAuth流程将无效。请参阅此文章:https://developers.facebook.com/docs/facebook-login/security