2015-08-12 10 views
5

Prima di tutto la mia domanda riguarda il funzionamento dell'autenticazione drive_v2 di google e la creazione di nuovi file, ecc. Con l'app per le mie rails 4.2. Ho l'app per rails con devise/omniauth2 e google funziona perfettamente. Ho attivato nella console di google dev sia l'autenticazione web che l'autorizzazione dell'API di Google. Entrambi i segreti dei clienti sono scaricati e funzionanti.autenticazione google/apis/drive_v2 sulla nuova autenticazione di google Drive. Spero anche di evitare la frustrazione con google-api-client

Detto questo. Ho bisogno della mia app per le rotaie in accesso offline per poter usare, creare ed eliminare goole Documenti e fogli di calcolo. Ho impostato lo scopo per .drive, impostare l'accesso offline ecc.

Ho scritto codice EVEN che funziona bene se vado nel parco giochi di google e ottenere un nuovo token di accesso da utilizzare.

Il mio primo problema è la capacità di ottenere il mio refresh_token e autenticare o ottenere uno nuovo utilizzando il google-api-client (versione 0.9pre3 così la gente non sono confuso)

Per poter utilizzare il nuovo Google api Avevo bisogno di commentare google drive dal momento che sembrava che tutte le API fossero combinate nel client.

gem 'omniauth-google-oauth2' 
#gem 'google_drive' 
gem 'google-api-client', '0.9.pre3' 

Sono bloccato sulla fase di autenticazione/autorizzazione e mi sento piuttosto stupido a riguardo.

Quindi il codice di esempio sul repository github per l'API here o il sito dev di google here mi portano a credere che funzioni.

require 'google/apis/drive_v2' 

Drive = Google::Apis::DriveV2 # Alias the module 
drive = Drive::DriveService.new 
drive.authorization = authorization # See Googleauth or Signet libraries 

o

drive.authorization = Google::Auth.get_application_default([Drive::AUTH_DRIVE]) 

naturalmente ciò che è l'autorizzazione? Secondo i documenti, vado here.

L'esecuzione del codice di esempio riportato di seguito: richiedono 'googleauth'

Prendi l'ambiente di autorizzazione configurato

scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/compute'] 
authorization = Google::Auth.get_application_default(scopes) 

porta a:

authorization = Google::Auth.get_application_default(scopes) 
RuntimeError: Could not load the default credentials. Browse to 
https://developers.google.com/accounts/docs/application-default-credentials 
for more information 
from /Users/prussiap/.gem/ruby/2.2.0/gems/googleauth-0.4.2/lib/googleauth.rb:116:in `get_application_default' 

Probabilmente a causa della mia confusione o stupidità.

L'altro metodo visualizzato nei documenti del sito di google dev collegato in precedenza e gli account di servizio sembrano il modo di andare alias here.

Ma niente funziona. Ho visto un'infarinatura di questi client_secrets troppo

client_secrets = Google::APIClient::ClientSecrets.load 
authorization = client_secrets.to_authorization 

, naturalmente, che .load rompe su di essa la propria, come si aspetta un percorso di file o il nome del file, ma nulla di magico ho dato da mangiare ha funzionato

Ogni codice di esempio che mi permette sia uso per il mio client_secret per conto del servizio o OAuth2 (web app), ma senza alcun redirect fantasia sarebbe fantastico e davvero aiutare ..

Ora per gli altri nuovi per l'API di Google si prega di leggere qui di seguito.Mi sento stupido per non averlo visto o averlo notato ma forse questa informazione può aiutarti ragazzi quando ho sollevato lo issue sul repository github ero confuso ..

A quanto pare il client API di Google per ruby ​​è totalmente diverso da < 0.9pre1 o maggiore di quello. Così è la documentazione.

Quindi, se state leggendo questo tipo di codice e state leggendo queste docs:

require 'google/api_client' 
require 'google/api_client/client_secrets' 
require 'google/api_client/auth/installed_app' 
require 'google/api_client/auth/storage' 
require 'google/api_client/auth/storages/file_store' 
require 'fileutils' 

APPLICATION_NAME = 'Drive API Quickstart' 
CLIENT_SECRETS_PATH = 'client_secret.json' 
CREDENTIALS_PATH = File.join(Dir.home, '.credentials', 
          "drive-quickstart.json") 
SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly 

Poi si sta utilizzando < 0.9pre1 (sono abbastanza sicuro)

Altrimenti si vede il mio codice in alto con l'unità_v2, quindi rimuovi la tua gemma google_drive perché viene inserita in una API e legge il documento this.

Spero che questo aiuti gli altri.

E qualsiasi aiuto sul mio problema di autenticazione tra cui l'utilizzo di servizi vs API vs altro tipo di account con alcuni codice di esempio per l'autenticazione e quindi l'autenticazione con un token di aggiornamento. Sarebbe fantastico

+0

eh, im non avere questo problema. Sto solo avendo il problema con l'utilizzo di omniauth-google-oauth2 e mi chiedo se non sono supposto come dovrei sostituire quella porzione di client secret.json (dal momento che l'id e il segreto del client sono salvati nel file omniauth.rb) e come procedere da lì . la mancanza di documentazione è ...Tipico, immagino, ma ho intenzione di pubblicare le istruzioni se riesco a far funzionare questa roba – dtc

+0

Anche questo errore. Sembra che la domanda possa essere ridotta alla sola parte di autenticazione poiché il contesto dell'API dell'unità non è correlato al codice che causa l'errore. Sto cercando di accedere all'API di analisi personalmente ... –

risposta

0

Ero in esecuzione su sistema operativo Windows e ho riscontrato questo problema. Risulta che c'è un bug nella libreria auth ruby ​​per il rilevamento del sistema operativo.

https://github.com/google/google-auth-library-ruby/issues/55

Se si tira giù la versione più recente della gemma del googleauth direttamente o indirettamente tramite google-api-client, si otterrà la correzione.

5

Ho appena incontrato lo stesso problema - non ho risolto totalmente, ma ho passato questo particolare errore impostando la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS, e che punta a una chiave di file account di servizio - questo è non è uguale al client_secrets che ha funzionato per le versioni precedenti dell'API.

Le istruzioni di Google nella loro documentazione: Application Default Credentials: How They Work lo depongono, ma la nota importante è che "account di servizio" è un metodo di autenticazione diverso da client_secrets.

Innanzitutto, vai alla pagina Developers Console API Credentials per il tuo progetto e scegli un esistente/crea una nuova "chiave di account di servizio". Assumere abbiamo messo il file scaricato in .json /path/to/svc_acct_auth.json

Nel codice rubino, aggiungere la riga:

ENV["GOOGLE_APPLICATION_CREDENTIALS"] = '/path/to/svc_acct_auth.json'

Questo dovrebbe ottenere il servizio di tornare correttamente e superare l'errore di runtime. Certo, sto ancora avendo problemi nell'eseguire le chiamate di cui ho bisogno attraverso questo sistema di autenticazione, ma hey! Mi sono laureato ai nuovi & messaggi di errore migliori.

+0

Ciò ha funzionato perfettamente. Ci sono numerose versioni di informazioni obsolete e contraddittorie là fuori e molte di esse si trovano sul sito di Google. Penso che sia ragionevole aspettarsi che rimuovano cose che non funzionano più. Ora posso riconoscere e ignorare le cose più vecchie e sto finalmente facendo progressi. Per lo meno, le loro pagine dovrebbero avere date di pubblicazione chiare ma non lo fanno. – adg

0

Ecco il codice che ho usato per salvare i backup su unità db google, forse aiuta:

require 'google/apis/drive_v2' 
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = "#{Rails.root}/config/google_api_credentials.json" 
drive = Google::Apis::DriveV2::DriveService.new 
drive.authorization = Google::Auth.get_application_default([Google::Apis::DriveV2::AUTH_DRIVE_FILE]) 

metadata = {title: File.basename(archive_path, '.sql.bz2')} 
file = drive.insert_file(metadata, upload_source: archive_path, content_type: 'application/x-bzip2') 

perm_id = drive.get_permission_id_for_email('[email protected]') 
perm = Google::Apis::DriveV2::Permission.new(role: 'writer', id: perm_id.id, type: 'user') 
drive.insert_permission(file.id, perm)