Создание и сохранение токенов доступа simplejwt Django

#django #django-rest-framework #axios #django-rest-auth #django-rest-framework-simplejwt

#django #django-rest-framework #axios #django-rest-auth #django-rest-framework-simplejwt

Вопрос:

Я следовал этому руководству: https://medium.com/@gerrysabar/implementing-google-login-with-jwt-in-django-for-restful-api-authentication-eaa92e50522d чтобы попытаться реализовать логин на основе Google из моего интерфейса, пока все работает с точки зрения создания учетной записи на основе токена Google, а затем создания токена с помощью refreshToken.for_user(). Тем не менее, я попытался протестировать свое приложение, создав очень простое представление для его тестирования с помощью классов разрешений, как показано ниже:

 class VerifyAuthView(APIView):
    permission_classes = (IsAuthenticated,)
    def post(self,request):
        return Response({"status":"true"})

  

При попытке доступа к этому я получаю сообщение об ошибке 401.
У меня есть пара идей, что это может быть, например:

  • Я заметил, что в панели администратора django в разделе токены ничего не указано даже сразу после создания, возможно, токен только генерируется, а не сохраняется, хотя я не могу понять, почему
  • Я видел, как несколько человек говорили, что это может быть связано с классами разрешений rest_framework, хотя их изменение пока не помогло

Мой Views.py (также содержит мой VerifyAuthView, как указано выше):

 from django.contrib.auth.base_user import BaseUserManager
from django.contrib.auth.hashers import make_password
from rest_framework.utils import json
from rest_framework.views import APIView,status
from rest_framework.response import Response
import requests
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth.models import User


class GoogleView(APIView):
    def post(self,request):
        payload = {'access_token':request.data.get("access_token")} #validating token
        req = requests.get('https://www.googleapis.com/oauth2/v2/userinfo',params= payload)
        data = json.loads(req.text)

        if 'error' in data:
            content = {'message': 'Invalid Google Token'}
            return Response(content)
        email = data['email']     

        #check if user has authenticated before or not
        try:
            user = User.objects.get(email=data['email'])

        except User.DoesNotExist:
            #Create user if they have not logged in before
            user = User()
            user.username = data['email']
            user.password = make_password(BaseUserManager().make_random_password())
            user.email = data['email']
            user.save()

        #Creating access token for user
        token = RefreshToken.for_user(user)
        response = {}
        response['username'] = user.username
        response['access_token'] = str(token.access_token)
        response['refresh_token'] = str(token)

        return Response(response)
  

И в моих настройках.py мой атрибут rest_framework настроен следующим образом:

 CORS_ORIGIN_ALLOW_ALL = True

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES':[
    #for demo purposes will need to be changed for privacy concerns
        'rest_framework.permissions.AllowAny',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
} 
  

Я делаю запрос на интерфейсе в react через axios следующим образом:

 const headers = { Authorization: 'Bearer '   accesstoken};
        let res = await axios.post("http://localhost:8000/rest-auth/token/verify-access-token/",
           {headers}
        );
  

Комментарии:

1. возможно, срок действия токена истек. По умолчанию токен DRF simplejwt истекает через 5 минут. Попробуйте использовать новый токен.

2. Поправьте меня, если я ошибаюсь, но когда пользователь входит в систему здесь, ему выдается новый токен (по крайней мере, насколько я понимаю, это то, что делает refreshToken.for_user в GoogleView), в настоящее время я создаю сообщение из своего интерфейса почти сразу после входа в систему, следовательно, я делаю это с новым токеном, поэтому я не думаю, что это проблема, но спасибо за ваш ответ

3. Как получить accesstoken вызов axios здесь? const headers = { Authorization: 'Bearer ' accesstoken}; Я думаю, проблема может быть где-то здесь.