Неавторизованный ответ на 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)
}