2015-06-19 9 views
5

Mam aplikację szyn (4.2.0), która używa funkcji logowania do Facebooka. Głównymi klejnotami są devise (3.4.0) i omniauth-facebook (2.0.0). Zarejestrowałem aplikację na Facebooku i korzystam z jej aplikacji testowej do programowania. Funkcja logowania na Facebooku działa w środowisku programistycznym.Uzyskiwanie błędu zwrotnego w serwisie Facebook nawet po włączeniu opcji "Logowanie OAuth przeglądarki wbudowanej" i określenie adresu URL wywołania zwrotnego

Podczas próby użycia funkcji logowania na Facebooku na serwerze produkcyjnym pojawia się błąd, ponieważ "Podany adres URL nie jest dozwolony w konfiguracji aplikacji: co najmniej jeden z podanych adresów URL jest niedozwolony w ustawieniach aplikacji. URL witryny lub URL strony docelowej lub domena musi być poddomeną jednej z domen aplikacji. "

The informacji o ustawieniach aplikacji testowej wykorzystywane w env dev są -

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" 

The szczegółów dotyczących ustawień zarejestrowanej aplikacji wykorzystywanych w env produkcji są -

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" 

Podałem następujące informacje w mojej 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 

i zostały przy użyciu creds z secrets.yml w initialiser opracować jako

# ==> 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'] 

basic settings for test app callback url for test app basic settings for app callback url for app

rzeczywista nazwa domeny (zaczernione) nie ma literówek w dowolnym miejscu i jest to samo, wszędzie tam, gdzie jest używane.

Zawiera od routes.rb związanej omniauth są

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 

Trasy są jak poniżej

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 

Jedynym kod związany z omniauth w całej aplikacji jest jak

$ 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

_ "Musi to być adres URL witryny lub URL strony Canvas lub domena musi być poddomeną jednej z domen aplikacji" _ - i co masz ustawiono tę wartość? – CBroe

+0

Podałem większość szczegółów dla "Ustawienia" i dla zakładki "Podstawowe" i "Zaawansowane" dla Facebooka w pytaniu –

+0

Jak wygląda twój 'routes.rb'? – fylooi

Odpowiedz

1

Po dalszym wykryciu problemu zauważono, że błąd nie wystąpił, gdy w adresie URL podano "www.example.com", a zatem zadziałało wywołanie zwrotne. Kiedy "przykład.com został podany w pasku adresu i logowanie facebook zostało zakończone, logowanie uległo awarii z powyższym błędem.

Naprawiłem powyższy problem, wprowadzając pewne zmiany w ustawieniach aplikacji Facebook. Nie wiem, czy to jest właściwe podejście, ale się udało. Samo wprowadzenie zmiany, jak w punkcie 2, nie rozwiązało problemu.

Zmiany są następujące:

1) Określone w App Domains '' z 'example.com' i 'www.example.com' 2) Włączone 'klient OAuth Login' na 'Tak' 3) Określone "Prawidłowe identyfikatory URI przekierowania OAuth" z "http://example.com/users/auth/facebook/callback" i "http://www.example.com/users/auth/facebook/callback"

2

Nie mam wystarczającej reputacji, aby skomentować. Musisz zmienić ustawienia w centrum deweloperów Facebooka, aby pasowało do adresu URL witryny produkcyjnej zamiast localhost.

Aktualizacja URL tutaj:

Enter URL here

+0

pls przeczytaj pytanie. Zarejestrowałem aplikację i utworzyłem testową aplikację dla tego samego. rzeczywista aplikacja jest używana w prod, podczas gdy aplikacja testowa jest używana w dev. Wszystkie ustawienia zarówno aplikacji testowej, jak i samej aplikacji są takie same, z wyjątkiem sytuacji, gdy mam "localhost: 3000", ponieważ w adresie URL został zamieniony na "www.mysite.co". –

0

Ok, więc zakładam, że masz aplikację nie pracuje na Facebooku, że po prostu wykorzystuje przepływ Facebook OAuth dla funkcjonalności logowania, prawda? Jeśli tak, musisz włączyć "Login OAuth klienta" w ustawieniach aplikacji dla środowiska produkcyjnego. Jeśli tego nie zrobisz, internetowy przepływ informacji OAuth nie będzie działać. Zobacz ten artykuł: https://developers.facebook.com/docs/facebook-login/security

Powiązane problemy