2012-10-10 9 views
5

La nostra app Rails 3 utilizza facebook-omniauth, consentendo agli utenti di autenticarsi con Facebook.Autentica utente dal server iOS Rails 3 e Omniauth

Sarebbe bello utilizzare il più possibile il sistema di autenticazione basato sul web, quindi ho provato a seguire la risposta (quella che non è stata sottovalutata) a this SO question ma non riesco a farla lavoro.

Il succo della risposta è:

omniauth-facebook gestirà le richieste al punto finale di richiamata con un parametro access_token senza alcuna difficoltà. Facile :)

Quindi, per testare questo, nel mio browser mi rilascia la seguente richiesta:

/users/auth/facebook_api/callback?access_token=BAAB... 

Ma nel mio log del server, vedo:

(facebook) Callback phase initiated. 
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"Missing authorization code","type":"OAuthException","code":1}} 

posso capisco cosa sto sbagliando. È il fatto che sto cercando di farlo attraverso il browser per testare qualcosa? Qualche altra idea su come posso riutilizzare la mia logica di autenticazione basata su www per la mia app ios?

UPDATE: Non sono sicuro, ma sto seguendo this guide al fine di avere strategie multiple facebook omniauth, uno per www e un altro per il mobile.

+0

Hai trovato una risposta per questo? Sto avendo esattamente lo stesso problema! Questa è la mia domanda http://stackoverflow.com/questions/14341867/how-to-authenticate-with-facebook-using-rest-with-devise-omniauth – Andres

+1

Sfortunatamente non l'ho fatto, ma ho appena postato il mio workaround come risposta ufficiale Non so come il poster nella domanda che ho collegato abbia funzionato la sua soluzione, ma assolutamente non ci sono riuscito. – djibouti33

risposta

7

Non ho mai trovato una soluzione in linea con quello che chiedevo in origine, ma ecco come ho risolto: prendi il token di accesso che ottieni sull'iPhone e invialo al server ed esegui l'accesso manualmente.

def facebook_login 
    graph = Koala::Facebook::API.new(params[:user][:fb_access_token]) 
    profile = graph.get_object('me') 
    omniauth = build_omniauth_hash(profile) 

    @user = User.find_or_create_for_facebook_oauth(omniauth) 
end 

Su www abbiamo già avuto un metodo chiamato find_or_create_for_facebook_oauth, e che ha preso il risultato da Omniauth e sia individuato l'utente o creato uno nuovo. Per utilizzare questo metodo per i dispositivi mobili, ho dovuto costruire una struttura simile a mano in modo da poterla passare come argomento.

def build_omniauth_hash(profile) 
    struct = OpenStruct.new 
    struct.uid = profile['id'] 
    struct.info = OpenStruct.new 
    struct.info.email = profile['email'] 
    struct.info.image = "http://graph.facebook.com/#{profile['id']}/picture?type=square" 
    struct.info.first_name = profile['first_name'] 
    struct.info.last_name = profile['last_name'] 
    struct.info.bio = profile['bio'] 
    struct.info.hometown = profile['hometown']['name'] if profile['hometown'] 
    struct.info.location = profile['location']['name'] if profile['location'] 
    struct 
end 
+0

grazie amico, lo farò e se trovassi qualcos'altro ti aggiornerò qui! – Andres