6

Facebook ログイン機能を使用する rails(4.2.0) アプリケーションがあります。主な gem は devise(3.4.0) と omniauth-facebook(2.0.0) です。Facebook にアプリケーションを登録し、開発用のテスト アプリを使用しています。Facebook ログイン機能は開発環境で動作します。

本番サーバーで facebook ログイン機能を使用しようとすると、「指定された URL はアプリケーション構成で許可されていません: 1 つ以上の指定された URL がアプリの設定で許可されていません。Web サイトの URL またはキャンバス URL、またはドメインは、アプリのドメインの 1 つのサブドメインである必要があります。」

開発環境で使用されているテストアプリの設定の詳細は次のとおりです-

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

そして、deviseイニシャライザーで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']

テストアプリの基本設定 テスト アプリのコールバック URL アプリの基本設定 アプリのコールバック URL

実際のドメイン名 (黒塗り) はどこにもタイプミスがなく、どこで使用しても同じです。

omn​​iauth に関連する 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」で「App Domains」を指定 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 に答える