Estoy siguiendo este ejemplo en un intento de autenticar a mis usuarios con la API de Google.
Aquí está el código relevante que estoy usando, casi exactamente como en el ejemplo:
@app.route('/login/') def login(): flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.file']) flow.redirect_uri = 'https://localhost:5000/oauth2callback/' authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') session['state'] = state return redirect(authorization_url) #called by Google's oauth @app.route('/oauth2callback/') def oauth2callback(): state = request.args['state'] # Use the client_secret.json file to identify the application requesting # authorization. The client ID (from that file) and access scopes are required. state = session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.file'], state=state) flow.redirect_uri = url_for('oauth2callback', _external=True) authorization_response = request.url flow.fetch_token(authorization_response=authorization_response, code_verifier=False) Cuando hago esto, da el error, oauthlib.oauth2.rfc6749.errors.InvalidGrantError: (invalid_grant) Missing code verifier.
No sé qué es un verificador de código, ni los ejemplos mencionan uno.
El seguimiento de la pila está disponible si alguien cree que ayudará
¿Cómo puedo solucionar este problema? ¡Cualquier ayuda es apreciada!
Esto parece ser un error en la versión 0.4.0 de google-auth-oauthlib (consulte este problema anterior ; tenga en cuenta que se informó después de que se publicó esta pregunta SO).
Tienes las siguientes opciones:
pip install --upgrade google-auth-oauthlib==0.3.0google_auth_oauthlib.flow.Flow() , que debe ser una cadena aleatoria de 43-128 caracteres utilizada para verificar el intercambio de claves mediante PKCE : oauth2_session, client_config = google_auth_oauthlib.helpers.session_from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.file']), ) flow = google_auth_oauthlib.flow.Flow( oauth2_session, client_type='web', client_config=client_config, redirect_uri='https://localhost:5000/oauth2callback/', code_verifier='<random string>' ) Nota: El código es para su función de inicio de login() . Tendrá que ajustarlo ligeramente para que funcione en su función oauth2callback() .Basado en la respuesta de s3rvac, profundicé un poco en el código fuente y descubrí que la propiedad code_verifier de hecho se genera automáticamente en el métodoauthorization_url authorization_url() . Así que no es necesario que generes uno tú mismo.
En su método login() , después de la llamada a flow.authorization_url() , almacene flow.code_verifier en la sesión:
authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') # code_verifier is set in this method session['code_verifier'] = flow.code_verifier # Get and store the code session['state'] = state return redirect(authorization_url)Luego, en el método de devolución de llamada, simplemente vuelva a cargarlo:
flow = google_auth_oauthlib.flow.Flow( oauth2_session, client_type='web', client_config=client_config, redirect_uri='https://localhost:5000/oauth2callback/', code_verifier=session.get('code_verifier') # Load the code ) Uso Flow.from_client_config() para construir un Flow , pero solo agrego esta línea y funciona bien:
flow.code_verifier = session.get('code_verifier')