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
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
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? –