Django/Flask : Переработка аутентификации Flask Azure B2C в Django

Я хочу использовать аутентификацию Azure B2C в Django, однако в Django нет учебника по этому вопросу, а есть во Flask. Однако я никогда не кодировал во Flask.

Я использовал документацию/учебник от microsoft, которые делятся github с кодом flask, чтобы сделать это :

  1. https://docs.microsoft.com/en-us/azure/active-directory-b2c/configure-authentication-sample-python-web-app?tabs=windows

  2. https://github.com/Azure-Samples/ms-identity-python-webapp

Я пытаюсь преобразовать его в Django, но у меня возникает ошибка, которую я не понимаю! Сообщение об ошибке :

Internal Server Error: /login/
TypeError: Object of type HttpResponseRedirect is not JSON serializable

Вот код

views.py

def index(request) :
    if not request.session.get("user"):
        return redirect("login")
    return render('index.html', user=request.session["user"] )

def login(request):
    # Technically we could use empty list [] as scopes to do just sign in,
    # here we choose to also collect end user consent upfront
    request.session["flow"] = _build_auth_code_flow(scopes=list(json.loads(os.getenv("SCOPE"))))
  
    return render(request, "login.html", {'auth_url' : request.session["flow"]["auth_uri"]})


def authorized(request):
    try:
        cache = _load_cache(request=request)
        result = _build_msal_app(cache=cache).acquire_token_by_auth_code_flow(
            request.session.get("flow", {}), request.args)
        if "error" in result:
            return render("auth_error.html", result=result)
        request.session["user"] = result.get("id_token_claims")
        _save_cache(cache=cache, request=request)
    except ValueError:  # Usually caused by CSRF
        pass  # Simply ignore them
    return redirect("index")


def _load_cache(request):
    cache = msal.SerializableTokenCache()
    if request.session.get("token_cache"):
        cache.deserialize(request.ession["token_cache"])
    return cache

def _save_cache(cache, request):
    if cache.has_state_changed:
        request.session["token_cache"] = cache.serialize()

def _build_msal_app(cache=None, authority=None):
    return msal.ConfidentialClientApplication(
        os.getenv("CLIENT_ID"), authority=authority or os.getenv("AUTHORITY"),
        client_credential=os.getenv("CLIENT_SECRET"), token_cache=cache)

def _build_auth_code_flow(authority=None, scopes=None):
    return _build_msal_app(authority=authority).initiate_auth_code_flow(
        scopes or [],
        redirect_uri=redirect('authorized'))

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>Microsoft Identity Python Web App</h1>

    <li><a href='{{ auth_url }}'>Sign In</a></li>

    <footer style="text-align: right">Powered by MSAL Python {{ version }}</footer>
</body>
</html>

urls.py

from django.urls import path
from . import views
import os

from dotenv import load_dotenv

load_dotenv()

urlpatterns = [
    path('index/', views.index, name="index"),
    path('login/', views.login, name="login"),
    # path(f'{os.getenv("REDIRECT_PATH")}/', views.login, name="authorized"),
    path('getAToken/', views.login, name="authorized")
]

Я что-то неправильно сделал при переходе на Django? Откуда берется эта ошибка? Нужно ли что-то настраивать в azure bc2 ?

Не требуемый ответ (принятие решения Flask для DJango), но вы правы, нет примеров использования Django для aadb2c auth... Что я сделал, так это использовал "mozilla-django-oidc", который хорошо подходит для аутентификации azure oidc... Более подробно здесь: https://stackoverflow.com/a/74156780/592737

Вернуться на верх