浏览代码

fix API token_auth and CSRF setup

Nick Sweeting 1 年之前
父节点
当前提交
c1c55d6da7
共有 2 个文件被更改,包括 12 次插入5 次删除
  1. 2 2
      archivebox/api/auth.py
  2. 10 3
      archivebox/api/v1_auth.py

+ 2 - 2
archivebox/api/auth.py

@@ -30,8 +30,8 @@ def auth_using_token(token, request: Optional[HttpRequest]=None) -> Optional[Abs
 
     if not user:
         print('[❌] Failed to authenticate API user using API Key:', request)
-
-    return None
+        return None
+    return cast(AbstractBaseUser, user)
 
 def auth_using_password(username, password, request: Optional[HttpRequest]=None) -> Optional[AbstractBaseUser]:
     """Given a username and password, check if they are valid and return the corresponding user"""

+ 10 - 3
archivebox/api/v1_auth.py

@@ -3,6 +3,8 @@ __package__ = 'archivebox.api'
 from typing import Optional
 
 from ninja import Router, Schema
+from django.utils import timezone
+from datetime import timedelta
 
 from api.models import APIToken
 from api.auth import auth_using_token, auth_using_password
@@ -25,9 +27,14 @@ def get_api_token(request, auth_data: PasswordAuthSchema):
         request=request,
     )
 
-    if user:
-        # TODO: support multiple tokens in the future, for now we just have one per user
-        api_token, created = APIToken.objects.get_or_create(created_by_id=user.pk)
+    if user and user.is_superuser:
+        api_tokens = APIToken.objects.filter(created_by_id=user.pk, expires__gt=timezone.now())
+        if api_tokens.exists():
+            api_token = api_tokens.last()
+        else:
+            api_token = APIToken.objects.create(created_by_id=user.pk, expires=timezone.now() + timedelta(days=30))
+        
+        assert api_token.is_valid(), f"API token is not valid {api_token.abid}"
 
         return api_token.__json__()