Храните дополнительные данные, такие как refresh_token, при регистрации через access_token

Я пытаюсь зарегистрироваться, используя токен доступа для google. Мой фронтенд - next.js с next-auth.js, получающим access_token, refresh_token и т.д. Я использую python social auth с Django для сохранения информации о пользователе. Я использую access_token, предоставленный next-auth, для регистрации пользователя в Django. Как мне убедиться, что другие поля ответа, такие как refresh_token и expires, сохраняются в Django DB? Я могу передать необходимые поля из next-auth в API в Django, но не уверен, какой формат ожидается.

https://python-social-auth.readthedocs.io/en/latest/use_cases.html#signup-by-oauth-access-token

@psa('social:complete')
def register_by_access_token(request, backend):
    # This view expects an access_token GET parameter, if it's needed,
    # request.backend and request.strategy will be loaded with the current
    # backend and strategy.
    token = request.GET.get('access_token')
    user = request.backend.do_auth(token)
    if user:
        return HttpResponse(json.dumps(get_tokens_for_user(user)))
    else:
        return HttpResponse('Unauthorized', status=401)

def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)
    update_last_login(None, user)

    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

Похоже, что вам нужна таблица для хранения этих маркеров (не уверен, что она у вас уже есть), давайте возьмем эту модель в качестве примера:

class StoredToken(models.Model):
    refresh_token = models.CharField()
    access_token = models.CharField()

    # Maybe you need the related user too?
    user = models.ForeignKey(User, on_delete=models.CASCADE)

После того, как вы создали таблицу, все, что вам нужно, это сохранить данные, когда они у вас есть, из вашего примера:

def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)
    update_last_login(None, user)

    StoredToken.objects.create(refresh_token=refresh, access_token=refresh.access_token, user=user)

    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

Вам, очевидно, нужно сделать миграции для создания вашей таблицы, но я предполагаю, что у вас есть знания для этого. В противном случае обратитесь к документации django для создания моделей

Я смог сохранить токен обновления вместе с другими EXTRA_DATA в python social auth, добавив response kwarg. Этот response kwarg - не что иное, как словарь, содержащий дополнительные данные.

Например: В Google, response является возвращаемым значением https://developers.google.com/identity/protocols/oauth2/web-server#exchange-authorization-code

@psa
def register_by_access_token(request, backend):
    # If it's needed, request.backend and request.strategy will be loaded with the current
    # backend and strategy.
    response = json.loads(request.body.decode('utf-8'))
    user = request.backend.do_auth(response['access_token'], response=response)
    if user:
        return HttpResponse(json.dumps(get_tokens_for_user(user)))
    else:
        return HttpResponse('Unauthorized', status=401)
Вернуться на верх