Capturing oauthlib.oauth2.rfc6749.errors.CustomOAuth2 Error cuando el usuario no se asigna a un papel para la aplicación

Tengo una aplicación Django que se ejecuta a través de Gunicorn y un proxy Nginx que utiliza la autenticación Azure AD (basado en el siguiente tutorial: https://learn.microsoft.com/en-us/graph/tutorials/python?tutorial-step=3).

En el momento en que un usuario accede a la aplicación a través de Azure AD y no se le asigna un papel, Django muestra una página de error genérica de 500. Quiero mostrar algo un poco más significativo para el usuario, pero no sé exactamente dónde necesito capturar el oauthlib.oauth2.rfc6749.errores. Error y mostrarlo.

Veo el programa de registros de Django: "oauthlib.oauth2.rfc6749.errores.CustomOAuth2Error (interaction_required) AADSTS50105: El firmado en el usuario '{EmailHidden}' no se asigna a un papel para la aplicación '[App ID]'(App Name). ”

¿Estaría dentro de la vista de callback que tengo que comprobar por este error de alguna manera? Esperaba que Azure mostrara el mensaje de error por defecto, pero eso no parece.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por binaryblossom


3 Respuestas:

  • Refiriéndolo enlace para más detalles de manejo de errores y manejo de excepción en MSAL para Python. Un enfoque más fácil sería hacer la aplicación para manejar el mensaje de error personalizado / página de visualización de error personalizado basado en la captura de error con la aplicación.

    Respondida el Dec 16, 2020 a las 12:45 - por webweaverx

    Votos positivos: 0 | Votos negativos: 0

  • Para capturar y manejar el error CustomOAuth2Error que se produce cuando un usuario no se asigna a un papel para la aplicación en Django, puedes agregar una lógica de manejo de excepciones en la vista donde se produce la llamada a la autenticación con Azure AD.

    Aquí tienes un ejemplo de cómo podrías manejar este error en tu vista de callback:

    python
    from oauthlib.oauth2 import CustomOAuth2Error
    
    

    En tu vista de callback

    def callback_view(request): try:

    Lógica para autenticar al usuario con Azure AD

    Tu código actual aquí

    except CustomOAuth2Error as e: error_message = "Ocurrió un error de autenticación: {}".format(str(e))

    Puedes mostrar un mensaje personalizado al usuario o redirigir a una página de error

    return render(request, 'error.html', {'error_message': error_message})

    Resto de la lógica de tu vista de callback

    En este código, se captura el CustomOAuth2Error específicamente y luego se maneja para mostrar un mensaje de error personalizado al usuario en lugar de la página de error genérica de 500.

    Recuerda importar CustomOAuth2Error en tu vista para poder capturar esta excepción. Además, asegúrate de personalizar el mensaje de error según tus necesidades.

    Respondida el Dec 17, 2020 a las 12:49 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para capturar este error específico y mostrar un mensaje más significativo al usuario, puedes hacerlo dentro de la vista de retorno de llamada. Aquí te muestro cómo puedes hacerlo:

    python
    from django.shortcuts import render
    from django.contrib.auth.decorators import login_required
    from oauthlib.oauth2.rfc6749.errors import CustomOAuth2Error
    
    @login_required
    def callback_view(request):
        

    Obtener el código de autorización del parámetro de consulta

    code = request.GET.get('code')

    Intentar obtener el token de acceso utilizando el código

    try:

    Tu código para obtener el token de acceso aquí

    ... except CustomOAuth2Error as e:

    Capturar el error de interacción requerida

    if e.error == 'interaction_required':

    Mostrar un mensaje de error al usuario

    return render(request, 'error.html', {'error_message': 'No se te ha asignado un rol para esta aplicación.'}) else:

    Manejar otros errores

    ...

    El resto de tu código para procesar el token de acceso aquí

    ...

    En este código:

    • Importamos las clases y excepciones necesarias.
    • Decoramos la vista con `@login_required` para asegurarnos de que el usuario está autenticado.
    • Obtenemos el código de autorización de la solicitud.
    • Intentamos obtener el token de acceso utilizando el código.
    • Si se produce un error `CustomOAuth2Error`, comprobamos si el error es `interaction_required`. Esto indica que el usuario no tiene un rol asignado para la aplicación.
    • Si el error es `interaction_required`, mostramos un mensaje de error al usuario utilizando la plantilla `error.html`.
    • Si el error es diferente de `interaction_required`, lo manejamos de manera adecuada.
    • Procesamos el token de acceso como de costumbre.

    También puedes personalizar el mensaje de error en la plantilla error.html para proporcionar más detalles al usuario.

    Respondida el Dec 17, 2020 a las 12:50 - por Gemini

    Votos positivos: 0 | Votos negativos: 0