فهرست منبع

Funcionando con passkeys

Tino 5 ماه پیش
والد
کامیت
5682830550
5فایلهای تغییر یافته به همراه82 افزوده شده و 3 حذف شده
  1. 1 1
      K8S/.current_version
  2. 1 1
      K8S/.version
  3. 2 1
      src/accounts/urls.py
  4. 77 0
      src/reymotausers/auth.py
  5. 1 0
      src/templates/_cabecera.html

+ 1 - 1
K8S/.current_version

@@ -1 +1 @@
-alpine-12
+alpine-16

+ 1 - 1
K8S/.version

@@ -1 +1 @@
-alpine-13
+alpine-17

+ 2 - 1
src/accounts/urls.py

@@ -2,9 +2,10 @@
 from django.urls import path
 from django.contrib.auth import views as auth_views
 from .views import SignUpView
+from reymotausers.auth import loginView
 
 urlpatterns = [
-    path('login/', auth_views.LoginView.as_view(), name='login'),
+    path('login/', loginView, name='login'),
     path('logout/', auth_views.LogoutView.as_view(), name='logout'),
     path("signup/", SignUpView.as_view(), name="signup"),
     path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),

+ 77 - 0
src/reymotausers/auth.py

@@ -0,0 +1,77 @@
+import json
+from django.contrib.auth import authenticate, login, logout
+from django.contrib.auth.forms import AuthenticationForm
+from django.shortcuts import render, redirect
+from rest_framework.exceptions import AuthenticationFailed
+from rest_framework.permissions import AllowAny
+from rest_framework.response import Response
+from rest_framework.serializers import Serializer, CharField
+from rest_framework.views import APIView
+
+from passkeys.api.token_backends import get_token_response
+
+def loginView(request):
+    if request.method == "POST":
+        passkeys_raw = request.POST.get("passkeys", "")
+        if passkeys_raw:
+            user = authenticate(request)
+            if user:
+                login(request, user)
+                return redirect(request.POST.get("next", "") or "dashboard")
+            form = AuthenticationForm(request)
+            form.add_error(None, "Passkey authentication failed. Try again.")
+        else:
+            form = AuthenticationForm(request, data=request.POST)
+            if form.is_valid():
+                user = form.get_user()
+                login(request, user)
+                return redirect(request.POST.get("next", "") or "dashboard")
+    else:
+        form = AuthenticationForm(request)
+    return render(request, "registration/login.html", {"form": form})
+
+# def create_session(request,username):
+#     user=User.objects.get(username=username)
+#     user.backend='django.contrib.auth.backends.ModelBackend'
+#     login(request, user)
+#     return HttpResponseRedirect(reverse('home'))
+
+
+def logoutView(request):
+    logout(request) # pragma: no cover
+    return  render(request,"logout.html",{}) # pragma: no cover
+
+
+class LoginSerializer(Serializer):
+    username = CharField()
+    password = CharField()
+
+
+class LoginAPIView(APIView):
+    """
+    Username + password login API.
+
+    Returns the same token format as passkey authentication
+    (JWT, DRF Token, or session depending on project config).
+    Use this to get an initial token before registering passkeys.
+    """
+
+    permission_classes = [AllowAny]
+    serializer_class = LoginSerializer
+
+    def post(self, request):
+        serializer = LoginSerializer(data=request.data)
+        serializer.is_valid(raise_exception=True)
+        user = authenticate(
+            request,
+            username=serializer.validated_data['username'],
+            password=serializer.validated_data['password'],
+        )
+        if user is None:
+            raise AuthenticationFailed("Invalid username or password")
+        token_data = get_token_response(user, request)
+        return Response({
+            'user_id': user.pk,
+            'username': user.get_username(),
+            **token_data,
+        })

+ 1 - 0
src/templates/_cabecera.html

@@ -62,5 +62,6 @@
         }
     </style>
     {% block head %}{% endblock %}    
+    {% block head %}{% endblock %}
  </head>