Django/Flask : Переработка аутентификации Flask Azure B2C в Django
Я хочу использовать аутентификацию Azure B2C в Django, однако в Django нет учебника по этому вопросу, а есть во Flask. Однако я никогда не кодировал во Flask.
Я использовал документацию/учебник от microsoft, которые делятся github с кодом flask, чтобы сделать это :
Я пытаюсь преобразовать его в 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