taiga-back/greenmine/base/auth/__init__.py

71 lines
1.7 KiB
Python

# -*- coding: utf-8 -*-
import base64
import re
from django.core import signing
from django.db.models import get_model
from rest_framework.authentication import BaseAuthentication
import greenmine.base.exceptions as exc
class Session(BaseAuthentication):
"""
Same as rest_framework.authentication.SessionAuthentication
but without csrf.
"""
def authenticate(self, request):
"""
Returns a `User` if the request session currently has a logged in user.
Otherwise returns `None`.
"""
http_request = request._request
user = getattr(http_request, 'user', None)
if not user or not user.is_active:
return None
return (user, None)
def get_token_for_user(user):
data = {"user_id": user.id}
return signing.dumps(data)
def get_user_for_token(token):
data = signing.loads(token)
model_cls = get_model("users", "User")
try:
user = model_cls.objects.get(pk=data["user_id"])
except model_cls.DoesNotExist:
raise exc.BadRequest("Invalid token")
else:
return user
class Token(BaseAuthentication):
"""
Stateless authentication system partially based on oauth.
"""
auth_rx = re.compile(r"^Bearer (.+)$")
def authenticate(self, request):
if "HTTP_AUTHORIZATION" not in request.META:
return None
token_rx_match = self.auth_rx.search(request.META["HTTP_AUTHORIZATION"])
if not token_rx_match:
return None
token = token_rx_match.group(1)
user = get_user_for_token(token)
return (user, token)
def authenticate_header(self, request):
return 'Bearer realm="api"'