2013-04-23 26 views
10

Ho integrato omniauth-facebook utilizzando https://github.com/plataformatec/devise/wiki/OmniAuth%3a-Overview.Rails: Impossibile autenticarti da Facebook perché "Credenziali non valide"

Could not authenticate you from Facebook because "Invalid credentials". 

E in ceppi, ottenendo in questo modo:: Ma io sono l'errore di ottenere

Authentication failure! invalid_credentials: OAuth2::Error, : {"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}} 

ho escogitare installato. Quando clicco su Facebook accedi link, torna a ideare il segno "www.mealnut.com/user/sign_in# =" e dà l'errore di cui sopra. Ho controllato la soluzione per "Credenziali non valide" su https://github.com/plataformatec/devise/wiki/OmniAuth%3a-Overview e, come indicato in precedenza, la mia app è impostata sull'intestazione per Tipo di app = Web. Non capisco perché non sta funzionando.

Anche la mia app è in attesa di revisione da parte di facebook. Ma non penso che sia correlato a questo errore. In seguito sono le cose che ho fatto per omniauth-facebook:

Gemfile contiene:

gem "omniauth", "~> 1.1.4" 
gem 'omniauth-facebook', '1.4.1' 

Nel modello di utente, ha aggiunto:

devise :omniauthable, :omniauth_providers => [:facebook] 
attr_accessible :provider, :uid 

    def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    user = User.where(:provider => auth.provider, :uid => auth.uid).first 
    unless user 
    user = User.create(name:auth.extra.raw_info.name, 
         provider:auth.provider, 
         uid:auth.uid, 
         email:auth.info.email, 
         password:Devise.friendly_token[0,20] 
        ) 
    end 
user 
end 

devise.rb

require "omniauth-facebook" 
config.omniauth :facebook, "APP_ID", "APP_SECRET", :scope => "offline_access, email" 

omniauth. rb:

OmniAuth.config.logger = Rails.logger 
Rails.application.config.middleware.use OmniAuth::Builder do 
provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], {:provider_ignores_state => true} 
end 

route.rb:

devise_for: utente,: controller => {: omniauth_callbacks => "omniauth_callbacks"}

Omniauth del controller:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user) 

    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 

può aiutare nessuno in questo?

+0

Im che ha lo stesso problema, ma il mio client_id viene passato (la chiave API/id), si può controllare l'output della console (se cromo, scheda di rete e verificare facebook, percorso è utenti/autenticazione) si dovrebbe vedere nel intestazioni qualcosa di simile a questa località: https:? //graph.facebook.com/oauth/authorize response_type = codice & client_id = ************ & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A3000% 2Fusers% 2Fauth% 2Ffacebook% 2Fcallback & scope = e-mail che ho volutamente tolto la chiave – Richlewis

+0

nel tuo caso anche se potrebbe essere semplice come cambiare omniauth-facebook alla versione 1.4.0 – Richlewis

+0

quando non sono connesso a Facebook, dà seguito nell'intestazione: https :? //www.facebook.com/login.php api_key = ********* & skip_api_login = 1 & display = pagina & cancel_url = http% 3A% 2F% 2Fwww.mealnut.com% 2Fuser% 2Fauth% 2Ffacebook% 2Fcallback% 3Ferror_reason% 3Duser_denied% 26error% 3Daccess_denied% 26error_description% 3DThe% 2 Buser% 2Bdenied% 2Byour% 2Brequest.% 26state% 376 & fbconnect = 1 & successivo = https% 3A% 2F% 2Fwww.facebook.com 2Fdialog% 2Fpermissions.request% 3F_path% 3Dpermissions.request% 26app_id continua ... – user2206724

risposta

5

Funzionante!

I miei percorsi.rb e utente.rb erano sbagliati. E ha cambiato anche omniauth.rb! Qui ci sono i file precedenti e successivi:

mio routes.rb era:

devise_for :user, :controllers => { :registration => "registration" } 
devise_for :user, :controllers => { :omniauth_callbacks => "omniauth_callbacks" } 

Così stava chiamando escogitare due volte. Ho cambiato in:

devise_for :user, :controllers => { :registration => "registration", :omniauth_callbacks => "omniauth_callbacks" } 

ha cambiato la mia omniauth.rb da questo:

OmniAuth.config.logger = Rails.logger 

Rails.application.config.middleware.use OmniAuth::Builder do 
provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], {:provider_ignores_state => true} 
end 

a questo:

OmniAuth.config.logger = Rails.logger 

Inoltre, ho metodo definito "def self.find_for_facebook_oauth (autenticazione, signed_in_resource = nil) "modello user.rb esterno (errore grave).

Quindi ottenuto che funziona perfettamente ora :-)

Spero che questo aiuti qualcuno.

+2

Ho solo pensato di farti sapere che puoi caricare le chiavi usando le variabili ENV, il che rende molto più sicuro .. Rails carica i suoi file in ordine alfabetico quindi se crei un file env.rb per memorizzare le tue variabili allora devise.rb non lo leggerò come devise config è inizializzato prima del file env.rb, quindi basta creare un file che inizi con C per esempio – Richlewis

+0

questo è un bel trucco. – user2206724

+0

Grazie, ho avuto lo stesso errore del tuo in omniauth.rb. Ho seguito un altro tutorial con l'autenticazione manuale e richiesto le tre righe in omniauth.rb. Passando a elaborare, sembra che queste linee causino il problema. – bibstha

2

ottenuto che funziona troppo :) Non abbiamo bisogno di aggiungere questo codice in omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'] 
end 

se abbiamo già dichiariamo in devise.rb

require "omniauth-facebook" 
config.omniauth :facebook, "APP_ID", "APP_SECRET" 
0

Mi ha aiutato per risolvere un problema simile:

Nota: v2.0.1 ha un problema con l'errore di richiamata url. È necessario aggiungere un url di richiamata su config.

config.omniauth :facebook, "APP_ID", "APP_SECRET", 
       callback_url: "CALLBACK_URL" 

https://github.com/plataformatec/devise/wiki/OmniAuth%3a-Overview

+0

Questo non mi aiuta. Solo token_params: {parse:: json} – dumP

34

Ho pensato di chip qui da quando questo è venuto per me quando si tenta di cercare una soluzione per non si poteva autenticare da Facebook perché “credenziali non valide”

Il problema è con Facebook API versione> = 2.3 è necessario impostare {token_params: {parse: :json}} alla propria configurazione provider.

devise.rb

config.omniauth :facebook, 
    APP_ID, 
    APP_SECRET, 
    token_params: { parse: :json } # <----- this line is NB 

risposta trovato su this issue per omniauth-oauth2

+1

Epic! Stavo avendo questo problema adesso e tu hai postato la soluzione 45 minuti fa. – vemv

+0

Pubblicato 14 ore fa, mi ha risparmiato un sacco di tempo oggi grazie @stan! – koonse

+0

mi ha fatto anche lavorare. grazie signore –

0

Aggiornamento gioiello da 4.0.0 e l'aggiunta di require "omniauth-facebook"-devise.rb risolto questo per me.

Problemi correlati