0

Ich versuche google's people api auf aws Lambda zu verwenden. Da die api erfordert oauth2 Ich versuchte, das oauth2 Token lokal zu holen und übertragen sie dann auf aws lambda:Oauth2 google Leute api auf aws Lambda

speichere ich die Geheimnisse mit dieser Funktion:

from oauth2client.file import Storage 
from oauth2client import client, tools 

def get_credentials(): 
    credential_path = os.path.join(SCRIPT_DIR, 'people-api-secret.json') 
    store = Storage(credential_path) 
    credentials = store.get() 
    if not credentials or credentials.invalid: 
     flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
     flow.user_agent = APPLICATION_NAME 
     credentials = tools.run_flow(flow, store) 
     print('Storing credentials to ' + credential_path) 
    return credentials 

Dann überweise ich people-api-secret.json aws Lambda die serverless mit Rahmen. Aber wenn ich versuche, das Geheimnis auf Lambda zu laden, gibt store.get()None zurück. Die Datei ist wirklich auf AWS (os.path.isfile(credential_path) gibt True zurück).

Ist es nicht möglich, diese Geheimnisse auf einem anderen Computer/IP-Adresse zu kopieren? Wenn nicht: Was wäre der "minimale Weg", um dies zum Laufen zu bringen, ohne den "flüggen Weg" zu machen, der z.B. here

aktualisieren Fand heraus, dass es ein einfacher Fehler auf Lambda „Zugriff verweigert“: print(open(credential_path).read()) ergibt [Errno 13] Permission denied: '/var/task/people-api-secret.json'. Ich denke diese Variablen sollten in die Umgebung gebracht werden, anstatt aus der Datei gelesen zu werden?

+1

Stellen Sie sicher, dass Sie Ihrer json-Datei die richtige Berechtigung (chmod) erteilt haben, bevor Sie Ihre Lambda-Funktion bereitstellen. Wenn Sie diese Datei zur Laufzeit herunterladen, versuchen Sie, die Anmeldeinformationen im Verzeichnis/tmp dir: '/tmp/people-api-secret.json' zu speichern. Dies ist der einzige Befehl, mit dem Sie Dateien in einen Lambda-Container schreiben können. –

Antwort

0

Während die richtigen Berechtigungen hätte wahrscheinlich funktioniert haben (nach Tom Melos Kommentar und this github issue) Ich wollte das Geheimnis in eine Umgebungsvariable setzen, weil dies als Best Practice beschrieben wird.

Zuerst brauchte ich einen Weg, um das Token zu bekommen, also lief ich diese (die die Datei client_secret.json benötigt, die Sie von der Google-API-Konsole herunterladen können folgende this guide):

from oauth2client import client, tools 

class MyStorage(client.Storage): 
    def locked_put(self, credentials): 
    print("="*70) 
    print("client_id: {}\nclient_secret: {}\nrefresh_token: {}".format(
     credentials.client_id, credentials.client_secret, credentials.refresh_token)) 
    print("="*70) 

flow = client.flow_from_clientsecrets('client_secret.json', 'https://www.googleapis.com/auth/contacts.readonly') 
flow.user_agent = 'my-user-agent' 
storage = MyStorage() 
tools.run_flow(flow, storage) 

Die resultierenden drei Saiten Ich habe die Umwelt in folgende this guide und dann dies war in der Lage zu tun:

import os 
from oauth2client import client 
from apiclient import discovery 

client_id = os.environ['GOOGLE_PEOPLE_CLIENT_ID'] 
client_secret = os.environ['GOOGLE_PEOPLE_CLIENT_SECRET'] 
refresh_token = os.environ['GOOGLE_PEOPLE_REFRESH_TOKEN'] 
credentials = client.GoogleCredentials(None, 
    client_id, 
    client_secret, 
    refresh_token, 
    None, 
    "https://accounts.google.com/o/oauth2/token", 
    'my-user-agent') 
http = credentials.authorize(httplib2.Http()) 
service = discovery.build('people', 'v1', http=http, 
    discoveryServiceUrl='https://people.googleapis.com/$discovery/rest', 
    cache_discovery=False) 

weitere Informationen (persönlich ich gerade gelernt, die Grundlagen des OAuth2) ich habe documented here was in dieser reque geschieht M und warum brauchen wir die refresh_token hier.

2

Laden Sie json mit dem geheimen Schlüssel wie Sie tun, dann tun dies:

#import GoogleCredentials 
from oauth2client.client import GoogleCredentials 

credentials = GoogleCredentials.get_application_default() 
service = discovery.build('people', 'v1', credentials=credentials,cache_discovery=False) 

Auf dem Lambda-Konfigurationssatz GOOGLE_APPLICATION_CREDENTIALS als Umgebungsvariable Schlüssel und Ihre Anmeldeinformationen json Dateinamen als Wert.

Es funktioniert auf alle meine Lambdas, die Google API verwenden.