2013-07-27 12 views
7

Mesi fa ho creato un'applicazione per i binari autenticata con google utilizzando oauth2, in particolare la gemma omniauth-google-oauth2. Ho avuto tutti i passaggi necessari per creare l'autenticazione e memorizzare un token di aggiornamento, ma recentemente oauth2 ha interrotto l'invio di un 'refresh_token' come parte della risposta. Originariamente stavo ricevendo una risposta che conteneva:Come posso recuperare un 'refresh_token' per l'app per rails con omniauth google oauth2?

credentials: { 
    refresh_token: XXX, 
    token: YYY, 
    expires_at: 1374840767, 
    expires: true 
}, 

Ora ho solo recuperare il token che scade nel giro di un'ora:

credentials: { 
    token: YYY, 
    expires_at: 1374840767, 
    expires: true 
}, 

io davvero non so quello che ho fatto sul lato domanda di cambia questo, quindi non sono sicuro se qualcosa è cambiato con google, o se è stato qualcosa che ho fatto. Per il contesto, il mio codice è simile:

inizializzatori/omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :google_oauth2, 'KEY', 'SECRET', {:scope => "userinfo.email,userinfo.profile,analytics.readonly,adsense.readonly"} 
end 

authentications_controller.rb è dove ricevo la risposta:

def create 
    auth = request.env["omniauth.auth"] 
    params = request.env["omniauth.params"] 
    project = Project.find(params['project_id']) 

    Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token']) 
    flash[:notice] = "Authentication successful." 
    redirect_to owner_view_project_path(project) 
end 

E 'possibile manca qualcosa in il mio file initializers/omniauth.rb? Ho provato ad aggiungere quanto segue alla hash opzioni, ma che non sembrano riportare il token di aggiornamento:

:approval_prompt => "force", :access_type => "offline" 

Qualsiasi aiuto sarebbe molto apprezzato! Grazie in anticipo!

+0

hai risolto questo problema? Sto affrontando lo stesso problema ora e mi piacerebbe vederti la soluzione. Grazie! –

risposta

8

Il messaggio: 'consenso' si sta ottenendo un token di aggiornamento. Qualcosa del genere dovrebbe funzionare:

Rails.application.config.middleware.use OmniAuth::Builder do 
    scopes = [ 
     # we need the profile scope in order to login 
     "https://www.googleapis.com/auth/userinfo.profile", 
     # this and other scopes could be added, but match them up with the 
     # features you requested in your API Console 
     "https://www.googleapis.com/auth/calendar" 
    ] 

    provider :google_oauth2, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, { scope: scopes.join(" "), access_type: 'offline', prompt: 'consent'} 
end 
+0

Il prompt: 'consenso' lo ha fatto per me – okysabeni

+0

Grazie: 'consenso' mi ha salvato – chickensmitten

+0

Sfondo: Sembra che un 'refresh_token' sia incluso solo quando l'utente conferma esplicitamente l'accesso (cosa che accade sempre alla prima richiesta). Le richieste di follow-up per l'autorizzazione sono auto-confermate perché Google ha ricordato la decisione, tuttavia, le conferme automatiche mancano di un 'refresh_token' (che ha senso). Questa risposta spiega come forzare il consenso, che garantisce che il 'refresh_token' sia presente. Si noti che questo interrogherà l'utente ogni volta per confermare la sua autorizzazione. – codener

2

come la vedo io, è sufficiente aggiungere

access_type: 'offline' 

alla portata del vostro provider.

Il trucco è il seguente nella definizione di Google: il token di aggiornamento viene fornito solo nella prima volta che l'app ottiene l'accesso all'account google.

Rifiuta l'autorizzazione e riottenere l'autorizzazione se si desidera visualizzare, ancora una volta, il token di aggiornamento inviato da google.

Vedere su Google definizione originale qui: "Se l'applicazione ha bisogno di aggiornare token di accesso quando l'utente non è presente il browser, quindi utilizzare tipo_accesso:. Offline Ciò comporterà l'applicazione di ottenere un token di aggiornamento la prima tempo l'applicazione scambia un codice di autorizzazione per un utente. " (https://developers.google.com/identity/protocols/OAuth2WebServer)

Problemi correlati