2014-11-07 11 views
6

sto lavorando con questo semplice esempio Google API:Come creare Google credenziali API OAuth oggetto da fonte alternativa

import httplib2 

from apiclient.discovery import build 
from oauth2client.client import flow_from_clientsecrets 
from oauth2client.file import Storage 
from oauth2client.tools import run 

# Path to the client_secret.json file downloaded from the Developer Console 
CLIENT_SECRET_FILE = 'client_secret.json' 

# Check https://developers.google.com/gmail/api/auth/scopes for all available scopes 
OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.readonly' 

# Location of the credentials storage file 
STORAGE = Storage('gmail.storage') 

# Start the OAuth flow to retrieve credentials 
flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE) 
http = httplib2.Http() 

# Try to retrieve credentials from storage or run the flow to generate them 
credentials = STORAGE.get() 
if credentials is None or credentials.invalid: 
    credentials = run(flow, STORAGE, http=http) 

# Authorize the httplib2.Http object with our credentials 
http = credentials.authorize(http) 

# Build the Gmail service from discovery 
gmail_service = build('gmail', 'v1', http=http) 

E visto che ho già passato attraverso l'OAuth flusso in precedenza (in un diverso non-Python app) e ho i miei token di aggiornamento, ecc. Vorrei saltare la prima parte di questo esempio e creare manualmente il file di archiviazione previsto gmail.storage o creare l'oggetto credenziali in un altro modo.

Il problema è che non riesco a trovare alcuna documentazione sul formato previsto di questo file di archiviazione o su cosa dovrebbe esserci o su come creare un'istanza dell'oggetto credenziali in un altro modo. Mi dispiace di non poter mostrare alcun lavoro qui, ma sono in perdita. Qualsiasi punto nella giusta direzione sarebbe molto apprezzato.

risposta

8

Molto semplice, a quanto pare funziona:

from oauth2client.client import GoogleCredentials 
from oauth2client import GOOGLE_TOKEN_URI 

access_token = None 
token_expiry = None 
token_uri = GOOGLE_TOKEN_URI 
user_agent = 'Python client library' 
revoke_uri = None 

gCreds = GoogleCredentials( 
    access_token, 
    client_id, 
    client_secret, 
    refresh_token, 
    token_expiry, 
    token_uri, 
    user_agent, 
    revoke_uri=revoke_uri 
    ) 
+0

Ho un file account di servizio che ha i seguenti tasti: '[u'private_key ' u'private_key_id', u'token_uri', u 'auth_provider_x509_cert_url', u'auth_uri ', u'client_email', u'client_id ', u'project_id', u'type ', u'client_x509_cert_url'] ', non riesco a capire quali valori passare per' refresh_token', che Non vedo nel file JSON dell'account di servizio. –

+0

preso a lavorare con il seguente codice (per gli account di servizio): 'da oauth2client importazione service_account service_account._JWTAccessCredentials.from_json_keyfile_dict (json.loads (service_acc_json_str))' –

0

Il oauth2client.file.Storage lib potrebbe essere di vostro interesse:

from oauth2client.file import Storage 

storage = Storage('gmail.storage') 
credentials = storage.get() 
storage.put(credentials) 
+0

È questo storage persistente? Ad esempio, è questo il posto giusto per archiviare le credenziali per migliaia di utenti che in seguito recupererai quando un servizio di backend deve riprendere e utilizzare quelle credenziali per, per esempio, pubblicare nuovi eventi nel calendario di qualcuno? – Praxiteles

+0

@Praxiteles Penso che contenga solo le tue credenziali; non di chiunque altro. –

0

Come spiegato qui: in Google Cloud Platform's github

è anche possibile utilizzare una stringa per configurare questo. Specialmente una stringa JSON

import json 
import os 
from google.oauth2 import service_account 
from google.cloud import translate 


info = json.loads(os.environ['GOOGLE_APPLICATION_CREDENTIALS_JSON_STRING']) 
creds = service_account.Credentials.from_service_account_info(info) 
# Instantiates a client 
translate_client = translate.Client(credentials=creds) 

prega di notare che ho usato le API di Google Translate per questo esempio, ma è la stessa logica.

C'è un po 'di più in questo numero spiegazione git troppo: https://github.com/GoogleCloudPlatform/google-cloud-python/issues/4477

Problemi correlati