0

Je souhaite utiliser le lecteur BigQuery de Tensorflow pour accéder aux données du projet de quelqu'un d'autre dans GCP. Qu'est-ce que je fais mal? Pour cela, j'utilise une application Flask où l'utilisateur peut fournir une autorisation sous la forme de OAuth2Credentials. Cette autorisation fonctionne correctement lors du test sur l'API BigQuery. Lorsque j'utilise le lecteur BigQuery pour mes propres données, cela fonctionne également très bien. Cependant, lors de l'initialisation du lecteur BigQery pour les données de quelqu'un d'autre, j'obtiens une erreur d'autorisation refusée.Lecteur BigQuery Tensorflow accédant aux données avec oauth

Ceci est mon code pour obtenir des autorisations

from oauth2client import client 
app = flask.Flask(__name__) 
from apiclient import discovery 

@app.route('/') 
@app.route('/index') 
def index(): 
    global service 
    if 'credentials' not in flask.session: 
     return flask.redirect(flask.url_for('oauth2callback')) 
    credentials = client.OAuth2Credentials.from_json(flask.session['credentials']) 
    if credentials.access_token_expired: 
     return flask.redirect(flask.url_for('oauth2callback')) 
    else: 
     http_auth = credentials.authorize(httplib2.Http()) 
     service = discovery.build('bigquery', 'v2', http_auth) 
     return 'ok' 

@app.route('/oauth2callback') 
def oauth2callback(): 
    flow = client.flow_from_clientsecrets(
      'client_secret.json', 
      scope='https://www.googleapis.com/auth/bigquery ' 
      + 'https://www.googleapis.com/auth/bigquery.insertdata ' 
      + 'https://www.googleapis.com/auth/cloud-platform', 
      redirect_uri=flask.url_for('oauth2callback', _external=True)) 
    if 'code' not in flask.request.args: 
     auth_uri = flow.step1_get_authorize_url() 
     return flask.redirect(auth_uri) 
    else: 
     auth_code = flask.request.args.get('code') 
     credentials = flow.step2_exchange(auth_code) 
     flask.session['credentials'] = credentials.to_json() 
     return flask.redirect(flask.url_for('index')) 

Si je lance le code pour accéder à l'API BigQuery cela fonctionne très bien donc je woudn't attends tout problème avec les autorisations:

response = service.projects().list().execute() 

Mais lors de la création du lecteur BigQuery avec ce code:

from tensorflow.contrib.cloud.python.ops.bigquery_reader_ops import BigQueryReader 
import tensorflow as tf 

reader = BigQueryReader(project_id=project_id, 
     dataset_id=dataset_id, 
     table_id=table_id, 
     timestamp_millis=millis, 
     num_partitions=10, 
     features=features_dict) 

queue = tf.train.string_input_producer(reader.partitions()) 

Je reçois une erreur d'autorisation refusée:

Permission denied: Error executing an HTTP request (HTTP response code 403, error code 0, error message '') 
when reading schema for project_id:dataset_id.table_id 

Répondre

0

L'authentification du connecteur TF BigQuery est pas très bien documenté et je ne peux pas sembler trouver les pièces pertinentes du code, mais je suppose qu'il utilise application default credentials.

Ceci est différent de l'appel brut BigQuery, où vous les passez explicitement lorsque vous générez le service. Une chose que vous pouvez essayer, quand vous effectuez credentials.to_json(), vider le résultat dans un fichier, et pointez une variable d'environnement GOOGLE_APPLICATION_CREDENTIALS à celui-ci. Je ne sais pas si ça va le réparer, mais ça vaut le coup d'essayer.

+0

Pour mon application, j'ai également besoin des informations d'identification par défaut pour accéder aux données de la banque de données, donc les ignorer créerait un nouveau problème. – Juta

+0

Hmm c'est un problème. Mais peut-être que si vous pouvez confirmer que c'est bien de cela que TF obtient les informations d'identification, vous pouvez commencer à penser à les contourner, c'est-à-dire en les divisant en deux microservices différents, chacun avec ses propres valeurs par défaut. Je suppose que l'autorisation est destinée à être dynamique et le partage de l'ensemble de données avec votre compte de service par défaut n'est pas une option? –