Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

316
Views
OAuth arroja "falta el validador de código" en Google OAuth2

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!

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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:

  1. Como solución alternativa, puede degradar la versión usada:
     pip install --upgrade google-auth-oauthlib==0.3.0
  2. Pase un verificador de código personalizado cuando cree una instancia de google_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() .
  3. Espere hasta que el error se solucione en sentido ascendente (siempre que sea un error). Después de eso, el verificador de código se generará automáticamente cuando no se proporcione.
over 4 years ago · Santiago Trujillo Report

0

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')
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!