2014-10-23 5 views
5

Sto lavorando su script per ottenere contatti Google utilizzando google contacts api gem. Sono in grado di accedere il token con successo utilizzando questo codice:get token, memorizzarlo, aggiornarlo se scaduto utilizzando oauth2 gem in ruby ​​

require 'rubygems' 
require 'launchy' 
require 'oauth2' 
require 'googlecontacts' 
require 'google_contacts_api' 

# Get your credentials from the console 
CLIENT_ID = 'your Id' 
CLIENT_SECRET = 'your Secret' 
OAUTH_SCOPE = 'https://www.google.com/m8/feeds' 
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' 

client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET,site: 'https://accounts.google.com',token_url: '/o/oauth2/token', authorize_url: '/o/oauth2/auth') 
url = client.auth_code.authorize_url(scope: OAUTH_SCOPE, redirect_uri: REDIRECT_URI) 
Launchy.open(url) 
$stdout.write "Enter authorization code: " 
code = gets.chomp 
token = client.auth_code.get_token(code, :redirect_uri => REDIRECT_URI) 

PROBLEMA:

So che questo non è il modo migliore per farlo, perché è faticoso. ogni volta che eseguo lo script l'utente ha fornito le istruzioni di accesso. E anche io devo copiare manualmente incollare il token dal browser al terminale.

DOMANDA:

Come può essere in grado di memorizzare il token recuperate, e quando scaduto come posso aggiornarlo?

risposta

6

Sembra che tu stia usando il oauth2 library per ottenere il token di accesso. Il AccessToken class ha i metodi to_hash() e from_hash(), che è possibile utilizzare per serializzare e deserializzare il token una volta ottenuto, nonché un metodo refresh() per aggiornare il token di accesso una volta scaduto. Se si tratta di uno script da riga di comando, è possibile utilizzare un file nascosto nella home directory dell'utente per memorizzare il token serializzato.

+0

ciò che non sto capendo è: "cosa posso aggiungere nel codice sopra in modo da restituire un hash con il token di accesso e anche il token di aggiornamento?". questo è il problema. Voglio dire qualcosa di simile: { "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "portatore", "refresh_token": "1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" } – ben

+1

Quando si esegue il metodo 'client.auth_code.get_token', la risposta sarà un oggetto' AccessToken'. E come puoi vedere nel [codice sorgente] (https://github.com/intridea/oauth2/blob/master/lib/oauth2/access_token.rb), questa classe ha tutte le informazioni che vuoi, come 'token' , 'refresh_token', expire info e un metodo per aggiornare l'auth. –

+0

Ho avuto modo. Grazie Rael ed Eric per la tua risposta. Ora sono in grado di accedere al token di aggiornamento. Troverò un modo per usarlo per lo scambio di un nuovo token una volta scaduto. – ben

3

Durante la prima autenticazione, si riceve un token di autorizzazione e un token di aggiornamento.

Memorizza il refresh_token (in sessione se si tratta di un'app Web o di qualsiasi altro schema di persistenza "volatile" o, in ultimo caso, nel database).

Utilizzando refresh_token, chiedere un nuovo token come descritto in Google OAuth2 WebServer documentation.

Se questa non è un'applicazione webserver, forse dovresti prendere in considerazione l'uso di altri OAuth2 authentication flows.

+0

esattamente non è un'applicazione webserver. Sotto la console delle applicazioni degli sviluppatori di Google, ho utilizzato il tipo di applicazione come APPLICAZIONE INSTALLATA. .. Ho visto l'autenticazione utilizzando flussi OAUTH2 come qui https://github.com/google/google-api-ruby-client-samples/blob/master/drive/drive.rb. Posso implementarlo, ma l'unico problema è come posso ottenere quel token di accesso specifico. forse puoi aiutarmi su come ottenere solo quel token. grazie per gli ans. – ben

+0

Giusto, quindi il documento Google per le applicazioni installate si trova [qui] (https://developers.google.com/accounts/docs/OAuth2InstalledApp). Ad ogni modo, il tuo utente dovrà affrontare una finestra del browser che richiede sovvenzioni. E ancora, riceverai 2 token, uno per l'autorizzazione e altri per l'aggiornamento. Poiché tutte le richieste sono solo richieste HTTP, è possibile utilizzare la gemma rest-client per seguire la documentazione. Posso chiederti il ​​tuo obiettivo? Forse importare i contatti? –

+0

sì, per importare tutti gli indirizzi e-mail. qualche idea che possa farmi fare meglio?E inoltre ho provato a seguire il google doc e sta aprendo la finestra dove dovrei copiare incollare il token sul terminale. Ho avuto un problema: come ottenere automaticamente il token come suggeriscono nella documentazione. – ben

1

Per ricevere un token di aggiornamento, è necessario alter the url.

in OAuth2:

url = client.auth_code.authorize_url(scope: OAUTH_SCOPE, access_type: "offline", redirect_uri: REDIRECT_URI)

allora sarà disponibile come Erik Koleda menziona.

Problemi correlati