Аутентифицировать Django Rest Framework при использовании Google Auth - PullRequest
0 голосов
/ 29 октября 2018

Когда я выполняю аутентификацию JWT через имя пользователя / пароль, это работает так:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

'''post looks like: <QueryDict: {
    'csrfmiddlewaretoken': ['Pd1mjNUXEdeiObEGOg8oNeqU18nwMVkSu8C29e0POGKwa2kY3yHiXk6hOEzuatMg'], 
    'email': ['tom@gmail.com'], 
    'password': ['xyxyzuzu'], 
    'evaluateUsername': ['Login']
}>'''

tokens = MyTokenObtainPairSerializer().validate(request.POST)
request.session["accessToken"] = tokens["access"]
request.session["refreshToken"] = tokens["refresh"]

Достаточно просто. Однако, если я использую Google Login, у меня нет доступа к электронной почте или паролю пользователя. Я могу легко получить письмо следующим образом:

if not request.POST.get('email'):
    request.POST._mutable = True
    request.POST['email'] = user.email
    # request.POST['password'] = '********' # placeholder
    request.POST._mutable = False

Но на django authenticate(user, password) все равно не получится, поэтому я получаю следующую ошибку:

rest_framework.exceptions.ValidationError: [ErrorDetail (string = 'Не найдена активная учетная запись с данными учетными данными', code = 'invalid')]

Как бы мне обойти это, так как я действительно не знаю пароль пользователя, если он входит в систему с помощью Google Auth, и любой способ предоставления значения falsey приводит к ошибке?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Единственный способ понять, как это сделать, - переписать метод validate. Например:

class TokenObtainSerializer(serializers.Serializer):
    username_field = User.USERNAME_FIELD

    def __init__(self, *args, **kwargs):
        super(TokenObtainSerializer, self).__init__(*args, **kwargs)
        self.fields[self.username_field] = serializers.CharField()
        self.fields['password'] = PasswordField()

    def validate(self, attrs):
        """
        Overwrite the `validate` method because with Google Auth we don't have a password.
        """

        email = attrs[self.username_field]
        self.user = User.objects.get(email=email)
        return {}
0 голосов
/ 29 октября 2018

Похоже на блок:

if not request.POST.get('email'):
    request.POST._mutable = True
    request.POST['email'] = user.email
    # request.POST['password'] = '********' # placeholder
    request.POST._mutable = False

уже имеет маркер сеанса пользователя, поэтому для недоступных конечных точек вы можете включить SesssionAuthenticationMiddleware в файле settings.py.

...