autenticación Python Flask para la unidad de Google API en el servidor Heroku
Estoy tratando de desarrollar una aplicación web en Python Flask que es capaz de atravesar el sistema de archivos de unidad de Google y desplegarlo en el servidor de Heroku. Sin embargo me quedé atrapado en el paso de autenticación. Cuando empiezo la aplicación localmente funciona bien. Después de presionar el botón de inicio de sesión Estoy redireccionado a la ventana de autenticación, me inicio en una cuenta de google y luego aparecen archivos en la raíz de mi unidad de Google. Sin embargo después de haber implementado mi aplicación a Heroku el archivo de página aparece muy bien pero cuando presiono el login de la aplicación se congela y no pasa nada por algún tiempo hasta que me equivoque el tiempo del cliente.
Comprobé el registro de Heroku y noté que el enlace de redirección de autorización se imprimió en el registro, así que intenté ejecutar el login de nuevo, copiar el enlace redirigido del registro de Heroku y utilizarlo para acceder a la ventana de autorización. Allí podría elegir una cuenta para iniciar sesión, pero después de confirmar el inicio de sesión el proceso de autorización se congeló, la aplicación nunca consiguió el acceso y todo el proceso terminó con el cliente de nuevo. Aquí está mi python Archivo de Flask app.py
Parece que:
from flask import Flask, redirect, render_template
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
app = Flask(__name__)
service = None
creds = None
tree = None
def createServiceFromCreds():
global service
global creds
service = build('drive', 'v3', credentials=creds)
def checkForExistingCredentials():
global creds
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
def validCredsExist():
global creds
checkForExistingCredentials()
if not creds or not creds.valid:
return False
return True
@app.route('/')
def index():
loggedIn = validCredsExist()
if loggedIn:
createServiceFromCreds()
page_token = None
files = []
while True:
response = service.files().list(q="'root' in parents and trashed=false",
spaces='drive',
fields='nextPageToken, files(id, name, mimeType, webViewLink)',
pageToken=page_token).execute()
for file in response.get('files', []):
files.append(file)
page_token = response.get('nextPageToken', None)
if page_token is None:
break
return render_template("homepage.html", loggedIn=loggedIn, files=files)
return render_template("homepage.html", loggedIn=loggedIn)
@app.route('/login')
def authorize():
global creds
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', 'https://www.googleapis.com/auth/drive')
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
createServiceFromCreds()
return redirect('/')
@app.route('/logout')
def logout():
global creds
global service
global tree
creds = None
service = None
tree = None
os.remove('token.pickle')
return redirect('/')
if __name__ == '__main__':
app.run()
Esto es lo que mi Procfile
para Heroku parece:
web: gunicorn app:app
Y este es el homepage.html
archivo:
html
Homepage
Welcome to homepage!
{% if loggedIn %}
{% for file in files %}
{{ file }}
{% endfor %}
{% endif %}
Estoy desesperada por ahora. No puedo encontrar una manera de realizar la autenticación de Google en el servidor de Heroku para poder acceder a la unidad de Google allí. Soy nuevo en todo esto para que mi comprensión del desarrollo web o autorización de Google sea bastante limitada. ¿Alguien podría ayudarme con esto o encaminarme en la dirección correcta para lograr lo que soy?
Pregunta hecha hace 3 años, 4 meses, 29 días - Por quantumquill62b1
2 Respuestas:
-
El problema que estás enfrentando probablemente se deba a que el flujo de autenticación que estás utilizando,
InstalledAppFlow
, está diseñado para aplicaciones de consola o de escritorio donde el usuario interactúa directamente con la aplicación. En el caso de una aplicación web como la tuya, necesitas utilizar un flujo de autorización diferente, como el flujo de autorización de flujo web.Para solucionar este problema y permitir la autenticación en tu aplicación web en Heroku, puedes seguir estos pasos:
- En primer lugar, asegúrate de que has configurado correctamente tus credenciales de OAuth en la consola de desarrolladores de Google y que tienes los archivos `credentials.json` necesarios.
- Modifica tu función `authorize()` en `app.py` para que utilice el flujo de autorización de flujo web en lugar de `InstalledAppFlow`. Aquí te dejo un ejemplo de cómo podría ser la modificación:
python @app.route('/login') def authorize(): global creds flow = InstalledAppFlow.from_client_secrets_file('credentials.json', ['https://www.googleapis.com/auth/drive']) auth_url, _ = flow.authorization_url( access_type='offline', include_granted_scopes='true') return redirect(auth_url)
- Actualiza tu función `callback()` en `app.py` para manejar la respuesta de Google después de que el usuario haya autorizado la aplicación. Aquí es donde se intercambia el código de autorización por las credenciales de acceso.
- Asegúrate de que tu aplicación web en Heroku está configurada correctamente para manejar las solicitudes de redirección desde Google OAuth y que la URL de redirección en tus credenciales de OAuth coincide con la URL de tu aplicación en Heroku.
Con estos ajustes, tu aplicación debería ser capaz de autenticar con la API de Google Drive en el entorno de producción en Heroku. Si continúas experimentando problemas, no dudes en consultarme de nuevo para obtener más ayuda.
Respondida el Dec 18, 2020 a las 09:58 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema:
La autenticación de Google no funciona en el servidor Heroku para una aplicación web Python Flask que accede a Google Drive.
Solución:
1. Configurar el entorno de Heroku:
Crea una variable de entorno llamada
GOOGLE_CLIENT_ID
y establece su valor como el ID de cliente de OAuth 2.0 de tu proyecto de Google. Crea una variable de entorno llamadaGOOGLE_CLIENT_SECRET
y establece su valor como el secreto de cliente de OAuth 2.0 de tu proyecto de Google. Crea una variable de entorno llamadaGOOGLE_REDIRECT_URI
y establece su valor como la URL de redirección que se especificó en la consola para desarrolladores de Google (generalmentehttps://your-app-name.herokuapp.com/login
).2. Modificar el código de autenticación:
En
app.py
, reemplazaflow.run_local_server(port=0)
conflow.run_console()
. Esto iniciará un proceso de autenticación basado en la consola en lugar del servidor local. Agrega un manejador de redireccionamiento a tu aplicación:python @app.route('/gauth_callback') def gauth_callback(): global creds code = request.args.get('code') flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', 'https://www.googleapis.com/auth/drive') creds = flow.step2_exchange(code) with open('token.pickle', 'wb') as token: pickle.dump(creds, token) createServiceFromCreds() return redirect('/')
3. Implementar el flujo de inicio de sesión:
Cuando un usuario hace clic en el botón de inicio de sesión, redirígele a
/login
. En la ruta/login
, inicia el flujo de autenticación de Google conflow.run_console()
. Después de que el usuario se autentique con éxito, Google redirigirá al usuario a/gauth_callback
con un código de autorización. En la ruta/gauth_callback
, canjea el código de autorización por credenciales de acceso y guárdalas entoken.pickle
.4. Otros consejos:
Asegúrate de que el archivo
credentials.json
esté incluido en tu aplicación Flask. Habilita la API de Google Drive en la consola para desarrolladores de Google. Si aún tienes problemas, intenta verificar los registros de Heroku para ver si hay algún error.Al seguir estos pasos, deberías poder autenticar correctamente a los usuarios en tu aplicación Flask Heroku y acceder a Google Drive.
Respondida el Dec 18, 2020 a las 10:07 - por Gemini
Votos positivos: 0 | Votos negativos: 0