2012-10-09 25 views
7

Ho un'app RoR in cui eseguo l'autenticazione con Google utilizzando omniauth e google_oauth2 dove sto richiedendo l'accesso offline.Come faccio ad aggiornare il mio token di accesso google_oauth2 utilizzando il mio token di aggiornamento?

Come utilizzare il mio token di aggiornamento per richiedere un token di accesso corrente? Inoltre, come posso aggiornare il mio token di accesso quando non funziona più? Non voglio avere alcuna interfaccia utente in questa situazione, presupponendo ovviamente che l'autorizzazione non sia stata tolta.

risposta

5

Non vedo nulla in google_oauth2 che gestisce il recupero di un nuovo access_token con un token di aggiornamento, quindi sembra che sia necessario effettuare lo scambio direttamente.

Google's official OAuth 2.0 documentation spiega come farlo a un livello basso. All'interno del codice lato server, utilizzare il vostro client HTTP preferito per costruire una richiesta che assomiglia a questo:

POST /o/oauth2/token HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

client_id=CLIENT_ID& 
client_secret=CLIENT_SECRET& 
refresh_token=REFRESH_TOKEN& 
grant_type=refresh_token 

dove CLIENT_ID e CLIENT_SECRET sono gli stessi che hai usato per l'autenticazione originale e REFRESH_TOKEN è il token di aggiornamento dal flusso di autenticazione originale. Se lo scambio è successo, riceverai un token di accesso fresca in una risposta che sembra qualcosa di simile:

{ 
    "access_token":"1/fFBGRNJru1FQd44AzqT3Zg", 
    "expires_in":3920, 
    "token_type":"Bearer", 
} 

è possibile seguire questa procedura per afferrare un nuovo token di accesso ogni volta che avete bisogno di uno. È possibile utilizzare il valore expires_in per stimare quando sarà necessario uno nuovo o tentare un aggiornamento ogni volta che la richiesta API risponde con uno stato HTTP 401.

9

Per un esempio utilizzando la gemma rubino HTTParty:

Dove @auth è un record di ActiveRecord che memorizza le chiavi auth per l'utente specifico che si sta cercando di aggiornare i token per.

# Refresh auth token from google_oauth2 and then requeue the job. 
    options = { 
    body: { 
     client_id: <YOUR GOOGLE API CLIENT ID HERE>, 
     client_secret: <YOUR GOOGLE API SECRET KEY HERE>, 
     refresh_token: @auth.refresh_token, 
     grant_type: 'refresh_token' 
    }, 
    headers: { 
     'Content-Type' => 'application/x-www-form-urlencoded' 
    } 
    } 
    @response = HTTParty.post('https://accounts.google.com/o/oauth2/token', options) 
    if @response.code == 200 
    @auth.token = @response.parsed_response['access_token'] 
    @auth.expires_in = DateTime.now + @response.parsed_response['expires_in'].seconds 
    @auth.save   
    else 
    Rails.logger.error("Unable to refresh google_oauth2 authentication token.") 
    Rails.logger.error("Refresh token response body: #{@response.body}") 
    end 
+0

dove implementeresti questo nella tua app per rotaie? per esempio ho una richiesta get per recuperare i contatti degli utenti usando httparty che invia il token, come direi postare il token di aggiornamento se il token è scaduto? – Richlewis

+0

Il codice che ho postato sopra è il codice che fa la richiesta POST per aggiornare il token. Dopo aver eseguito la richiesta GET, vorrei verificare se il codice di risposta è uguale a 401, che in genere è il codice che si ottiene quando è necessario aggiornare il token. Se il codice di risposta HTTParty == 401, esegui il mio codice (adattato alle tue esigenze). – Blake

+0

eccellente, ho lavorato in miniera, grazie – Richlewis

Problemi correlati