Как реализовать социальный вход с помощью dj-rest-auth и получить перенаправление обратно на фронтенд, который использует vanilla js с установленными cookies sessionid и token
В настоящее время я реализую социальный вход с помощью dj-rest-auth с пользовательским провайдером. Я просмотрел множество сайтов, но большинство руководств/ресурсов не показывают, как реализовать фронтенд, поэтому я не знаю, как его реализовать. Фронтенд может использовать только ванильный js и является SPA.
Моя текущая идея/тестирование заключается в использовании href=127.0.0.1/api/auth/callback, который будет запускать функцию callback. Если код не возвращается, он перенаправляет на авторизационный url, чтобы получить его и продолжить перенаправление обратно к той же функции, чтобы начать вход. После входа в систему происходит перенаправление на домашнюю страницу со всеми соответствующими cookies.
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.TokenAuthentication",
'rest_framework.authentication.SessionAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
Provider login api (http://127.0.0.1:8000/api/auth/provider/)
auth/views.py
redirect_uri = 'http://127.0.0.1:8000/api/auth/callback/'
def callback(request):
if 'code' in request.GET is None:
socialapp = SocialApp.objects.get(name='provider')
authorize_url = (f'{settings.OAUTH_SERVER_BASEURL}/oauth/authorize'
'?client_id=' + socialapp.client_id +
'&redirect_uri=' + quote(redirect_uri, safe='') +
'&response_type=code')
return redirect(authorize_url)
if 'code' in request.GET:
socialapp = SocialApp.objects.get(name='NAME')
code = request.GET['code']
context = {}
context['grant_type'] = 'authorization_code'
context['client_id'] = socialapp.client_id
context['client_secret'] = socialapp.secret
context['code'] = code
context['redirect_uri'] = 'http://127.0.0.1:8000/api/auth/callback/'
try:
token_response = requests.post('https://provider-api-link/oauth/token', json=context)
data = token_response.json() # access-token is inside
if 'error_description' in data:
print("error_description_post_code:", data)
social_login_response = requests.post('http://127.0.0.1:8000/api/auth/provider/', json=data)
response = HttpResponseRedirect('/')
response.set_cookie("Authorization", 'Token {}'.format(data["key"]), httponly=True)
return response
Теперь проблема в том, что в возвращаемом ответе есть куки авторизации, но sessionid и другие куки находятся в social_login_response вместо них. Как мне сделать перенаправление на домашнюю страницу с авторизационным токеном, sessionid и другими соответствующими куками?
Я пробовал просматривать куки в файле token_response.cookies, но не уверен, что это правильный способ обработки социального входа с помощью этого пакета. Любое решение или ссылка будут очень признательны.