59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import re
|
|
|
|
from rest_framework import exceptions
|
|
from rest_framework.authentication import BaseAuthentication
|
|
from mydata.blender_id import blender_id_server_validate, blender_id_server_authenticate
|
|
from mydata.models import MydataUser
|
|
|
|
|
|
class BlenderIdAuthentication(BaseAuthentication):
|
|
def authenticate(self, request):
|
|
"""Authenticates bearer token with Blender ID"""
|
|
bearer = request.META.get('HTTP_AUTHORIZATION')
|
|
if bearer is None:
|
|
return None
|
|
|
|
try:
|
|
bearer = re.search('Bearer (.*)', bearer).group(1)
|
|
except AttributeError:
|
|
return None
|
|
|
|
try:
|
|
response = blender_id_server_validate(bearer)
|
|
|
|
user = MydataUser()
|
|
user.id = response['id']
|
|
user.email = response['email']
|
|
user.name = response['full_name']
|
|
|
|
except MydataUser.DoesNotExist:
|
|
raise exceptions.AuthenticationFailed('invalid token')
|
|
|
|
return (user, bearer)
|
|
|
|
|
|
class BlenderIdBackend:
|
|
"""Custom django backend for Blender ID authentication"""
|
|
def authenticate(self, request, username=None, password=None):
|
|
try:
|
|
userdata = blender_id_server_authenticate(username, password)
|
|
except MydataUser.DoesNotExist:
|
|
return None;
|
|
|
|
if userdata is not None:
|
|
try:
|
|
user = MydataUser.objects.get(blender_id=userdata['blender_id'])
|
|
except MydataUser.DoesNotExist:
|
|
user = MydataUser(username=username)
|
|
user.blender_id = userdata['blender_id']
|
|
user.save()
|
|
return user
|
|
return None
|
|
|
|
def get_user(self, pk):
|
|
try:
|
|
return MydataUser.objects.get(pk=pk)
|
|
except MydataUser.DoesNotExist:
|
|
return None
|
|
|