Неавторизованный ответ на POST-запрос после обновления маркера JWT в Django

Цель: Я пытаюсь получить доступ к определенным данным пользователя с помощью JWT. В частности, я хочу получить идентификатор пользователя из JWT-токена, используя request.user.id.

Проблема: Я могу запустить api и обновить токены. Когда срок действия токенов истекает, я могу обновить их. Однако после этого я не могу получить доступ к своему API. Однако после обновления токенов я получаю ошибку, когда пытаюсь снова загрузить данные: "Unauthorized: /api/load/".

Есть ли здесь что-то явно неправильное?

Django представление для api/load/

class LoadDataSet(APIView):
    serializer_class = LoadDataSerializer
    queryset = UserPantry.objects.all()
    permission_classes = [IsAuthenticated]
    authentication_classes = [JWTAuthentication]

    def post(self, request, format=None):
        user = request.user.id
        print(user)
        return Response(status=status.HTTP_204_NO_CONTENT)

Вызов api в react native:

        const  res = await request({
            url:'/api/load/',
            method: 'POST',
            data: {'user_id': String(user_id)}
        })

Настройки JWT в Django

REST_FRAMEWORK = {
       'DEFAULT_AUTHENTICATION_CLASSES': (
   'rest_framework_simplejwt.authentication.JWTAuthentication',
   ),
 'DEFAULT_PERMISSION_CLASSES': [
    ],
    'DATETETIME_INPUT_FORMATS': ['%Y-%m-%d %H:%M'],
    'DATIME_FORMAT': '%Y-%m-%d %H:%M',
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema' 
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=3),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=60),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': False,
    'UPDATE_LAST_LOGIN': False,

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

    'AUTH_HEADER_TYPES': ('JWT', 'Bearer'),
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

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

    'JTI_CLAIM': 'jti',

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

Откликнитесь на собственный запрос JWT и обновите его


import axios from 'axios';
import { store } from '../store/store';
import jwt_decode from "jwt-decode";
import dayjs from 'dayjs'
import { api_address } from '../store/api_address';
import { UPDATE_ACCESS_TOKEN } from '../store/actions/types';
import { getCsrfToken } from '../store/actions/auth';

const client = axios.create({
    baseURL: api_address,
});

export const request = ({...options}) =>{
    client.defaults.headers.common['Content-Type'] = 'application/json';
    client.defaults.headers.common['X-CSRFToken'] = getCsrfToken();

    let auth_access = store.getState().auth?.access
    let auth_refresh = store.getState().auth?.refresh

    const user = jwt_decode(auth_access)
    const isExpired = dayjs.unix(user.exp).diff(dayjs()) < 1;
    

    if(isExpired){    
    axios.post(`${api_address}/api/token/refresh/`, 
    { "refresh": auth_refresh}).then((res) => { 
    console.log('res.status',res.status)
        let out = res.data
        store.dispatch({
            type: UPDATE_ACCESS_TOKEN,
            payload: out
        })

        client.defaults.headers.common['Authorization'] = `JWT ${out?.access}`;
        }).catch( )
    }else{
    client.defaults.headers.common['Authorization'] = `JWT ${store.getState().auth?.access}`;
    }

    const onSuccess = response => response
    const onError = error =>{
        // console.log(error)
        return error
    }

    return client(options).then(onSuccess).catch(onError)
}
Вернуться на верх