2012-11-03 9 views
11

To pytanie wydaje się być tak proste, aby odpowiedzieć, ale po dniach badań i kilku ślepych uliczkach, nie mogę wydawać wyników zapytania z BigQuery bez nalegań na OAuth użytkownika. Czy ktoś miał na to szczęście? Nie używam aplikacji Google AppEngine, jest ona hostowana pod numerem EC2. Oto dokładna sytuacja:Jak programowo zapytać program BigQuery z poziomu Pythona bez interakcji użytkownika końcowego?

User wants reporting data --> 
Web server makes queries to BigQuery --> 
Data is transformed for use in WebApp and returned to User. 

Ilekroć wykonaj przykłady Google, ja skończyć się coraz przeglądarki internetowej pojawiały się z prośbą o mnie, aby wybrać konto Google, aby użyć do uwierzytelniania.

Odpowiedz

16

Przykro mi, ale trudno jest znaleźć informacje na ten temat. Szukacie tego, co się nazywa Service Accounts, które są udokumentowane w naszym przewodniku Authorizing Access to the BigQuery API using OAuth 2.0.

Oto przykład, używając Python client library, chociaż będziemy chcieli spojrzeć na odnośną dokumentacją Informacje o nabyciu odpowiednich poświadczeń:

import httplib2 

from apiclient.discovery import build 
from oauth2client.client import SignedJwtAssertionCredentials 

# REPLACE WITH YOUR Project ID 
PROJECT_NUMBER = 'XXXXXXXXXXX' 
# REPLACE WITH THE SERVICE ACCOUNT EMAIL FROM GOOGLE DEV CONSOLE 
SERVICE_ACCOUNT_EMAIL = '[email protected]' 

# OBTAIN THE KEY FROM THE GOOGLE APIs CONSOLE 
# More instructions here: http://goo.gl/w0YA0 
f = file('key.p12', 'rb') 
key = f.read() 
f.close() 

credentials = SignedJwtAssertionCredentials(
    SERVICE_ACCOUNT_EMAIL, 
    key, 
    scope='https://www.googleapis.com/auth/bigquery') 

http = httplib2.Http() 
http = credentials.authorize(http) 

service = build('bigquery', 'v2') 
datasets = service.datasets() 
response = datasets.list(projectId=PROJECT_NUMBER).execute(http) 

print 'Dataset list:' 
for dataset in response['datasets']: 
    print '%s' % dataset['datasetReference']['datasetId'] 
+1

Ryan, dziękuję za odpowiedź. To mnie pogłębia. Przepuściłem wcześniej konta usług i było jasne, że tego właśnie szukałem, po prostu nie mogłem się dowiedzieć, gdzie to ustawić. Zrobiłem to i uruchomiłem powyższy kod z poprawnym ProjectId, e-mailem do konta usługi i plikiem klucza, ale kiedy pobieram odpowiedź na zestawienie zestawów danych, w dykcie nie ma klucza "datasets". Zamiast tego jest to coś takiego: {u'kind ': u'bigquery # datasetList', u'etag ': u' "viowSXH0JIvMREGVicRUeTw4PZo/L-a0Zjajejhksaj6mKpTzCQGsr4" '} – JawsTheGame

+1

Aby kontynuować, upewnij się, że dzwonisz do usługi Metoda .datasets(). list(). W powyższym przykładzie obiekt odpowiedzi ['datasets'] będzie zawierał listę obiektów opisu zbioru danych w postaci {u'kind ': u'bigquery # dataset', u'id ': u'projectXXXXXXX: TestDataset' , u'datasetReference ': {u'projectId': u'projectXXXXXXX ', u'datasetId': u'TestDataset '}} –

+0

Inna sprawa: jeśli nie masz żadnych zestawów danych w odpowiedzi API, prawdopodobnie nie utworzyłeś jeszcze. Czy możesz potwierdzić, że zrobiłeś to w projekcie, którego używasz? –

0

miałem ten sam problem. Jest to prawdopodobnie spowodowane brakiem wymaganych uprawnień w projekcie dla klucza konta usługi, z którego korzystasz.

+0

To jest bardziej komentarz niż odpowiedź. Rozważ umieszczenie krótkich odpowiedzi jako komentarzy. –

2

Jeśli zalogować lokalnie gcloud:

gcloud auth application-default login 

Następnie pliki poświadczenia zostaną zapisane w ~/.config/gcloud /, który może być ładowany z:

from oauth2client.client import GoogleCredentials 
from apiclient.discovery import build 

credentials = GoogleCredentials.get_application_default() 
service = build('bigquery', 'v2') 

lub można wystarczy załadować plik klucza bezpieczeństwa BQ bezpośrednio za pomocą:

from google.cloud import bigquery 
client = bigquery.Client.from_service_account_json(path_to_key.json) 
+0

Dziękujemy za odpowiedź wykorzystującą najnowsze biblioteki. Zauważ, że istnieje teraz strona dokumentacji https://cloud.google.com/bigquery/docs/authentication/service-account-file obejmująca te metody uwierzytelniania. –

+0

Należy pamiętać, że "domyślne logowanie aplikacji gcloud auth" nie jest już zalecane.Pobranie pliku kluczy JSON dla konta usługi i ustawienie zmiennej środowiskowej 'GOOGLE_APPLICATION_CREDENTIALS' jest najbardziej niezawodnym sposobem ustawiania poświadczeń w środowiskach mieszanych. –

Powiązane problemy