Настройка ответа JWT от django-rest-framework-simplejwt - PullRequest
0 голосов
/ 06 февраля 2019

Я настраиваю Django для отправки ответа JWT, а не для просмотра.Я попытался использовать django-rest-framework-simplejwt.

. В этой структуре есть функция TokenObtainPairView.as_view(), которая возвращает пару jwt.Мне нужно вернуть токен доступа с другим ответом Json, в отличие от двух предоставленных токенов.

В идеале мне нужен один JsonResponse, который содержит токен доступа, такой же, как этот: TokenObtainPairView.as_view().

Я попытался создать свое собственное представление, представленное ниже.

ОБНОВЛЕНИЕ: Предоставлено в Settings.py

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(days=1),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

Путь URL входа в систему

urlpatterns = [
    path('auth/', views.LoginView.as_view()),
]
1018 * LoginView Я создал
class LoginView(APIView):
    permission_classes = (AllowAny,)

    def post(self, request, *args, **kwargs):
        username = request.data['username']
        password = request.data['password']

        user = authenticate(username=username, password=password)

        if user is not None:
            payload = {
                'user_id': user.id,
                'exp': datetime.now(),
                'token_type': 'access'
            }

            user = {
                'user': username,
                'email': user.email,
                'time': datetime.now().time(),
                'userType': 10
            }

            token = jwt.encode(payload, SECRET_KEY).decode('utf-8')
            return JsonResponse({'success': 'true', 'token': token, 'user': user})

        else:
            return JsonResponse({'success': 'false', 'msg': 'The credentials provided are invalid.'})

узор, обеспечиваемый рамки.

urlpatterns = [
...
path('token/', TokenObtainPairView.as_view()),
...
]

Он возвращает этот маркер

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTQ5NDk3NDQ2LCJqdGkiOiI3YmU4YzkzODE4MWI0MmJlYTFjNDUyNDhkNDZmMzUxYSIsInVzZXJfaWQiOiIwIn0.xvfdrWf26g4FZL2zx3nJPi7tjU6QxPyBjq-vh1fT0Xs

1029 * eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTU0OTQ5NzQ0NiwianRpIjoiOTNhYzkxMjU5NmZkNDYzYjg2OGQ0ZTM2ZjZkMmJhODciLCJ1c2VyX2lkIjoiMCJ9.dOuyuFuMjkVIRI2_UcXT8_alCjlXNaiRJx8ehQDIBCg

Если вы идете https://jwt.io/ гты увидишь, что вернулось

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Пользовательский ответ токена, как это:

from rest_framework_simplejwt.tokens import RefreshToken


    class LoginView(APIView):
        permission_classes = (AllowAny,)

        def post(self, request, *args, **kwargs):
            ...

            // Get user token, include refresh and access token
            token = RefreshToken.for_user(user) 

            // Serializer token if it is not correct JSON format ^^

            return JsonResponse({'success': 'true', 'token': token, 'user': user})
0 голосов
/ 26 апреля 2019
  • Например : для настройки ответа simpleJWT путем добавления имени пользователя и групп,

enter image description here

  1. Переопределить метод validate в TokenObtainPairSerializer
# project/views.py

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView


class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = self.get_token(self.user)
        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)

        # Add extra responses here
        data['username'] = self.user.username
        data['groups'] = self.user.groups.values_list('name', flat=True)
        return data


class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer
заменить представление входа в систему настроенным представлением
# project/urls.py

from .views import MyTokenObtainPairView

urlpatterns = [
    # path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

?

Ссылки : SimpleJWT Readme иисходный код, как показано ниже: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...