Невозможно обновить Срок действия подписи токена JWT истек.

Я использую django-rest-framework-jwt и react-redux для своего SPA.

Требуется обновить токен, срок действия которого истекает через 5 минут. Refresh работает в течение 5 минут. После того, как это не сработает, консоль покажет эту ошибку:

POST http://localhost:8000/auth/api-token-refresh/ 400 (Bad Request)
createError.js:17 Uncaught (in promise) Error: Request failed with status code 400
    at createError (createError.js:17)
    at settle (settle.js:19)
    at XMLHttpRequest.handleLoad (xhr.js:78)

и почтальон покажет это:

{
    "non_field_errors": [
        "Signature has expired."
    ]
}

есть код промежуточного программного обеспечения

import axios from "axios";
import * as urls from "../helpers/url";
import { authUpdateToken } from "../actions/auth";

const jwthunk = ({ dispatch, getState }: any) => (next: any) => (action: any) => {
  if (typeof action === 'function') {
    if (getState().auth && getState().auth.token) {
      const currentToken = getState().auth.token;

      verifyToken(currentToken)
        .then((tokenVerified: any) => {
          refreshToken(tokenVerified, dispatch)
        })
        .catch(() => {
          refreshToken(currentToken, dispatch)
        })
    } else {
      console.log('Not Auth');
    }
  }
  return next(action);
}

export default jwthunk;

const verifyToken = async (token: any) => {
  const body = { token };
  let verifiedToken = '';

  await axios.post('http://localhost:8000/auth/api-token-verify/', body)
    .then(({ data: { code, expires, token } }: any) => {
      verifiedToken = token;
    });

  return verifiedToken;
}

const refreshToken = async (token: any, dispatch: any) => {
  const body = { token }

  await axios.post('http://localhost:8000/auth/api-token-refresh/', body)
    .then((response: any) => {
      dispatch(authUpdateToken({ token }));
    })
}

django-rest-framework-jwt отправляет уникальный токен без обновления токена


person MarianoV    schedule 10.05.2019    source источник


Ответы (1)


Я предполагаю, что в этой библиотеке есть недостаток. Вы не можете обновить токен с истекшим сроком действия ..

Решение

1) Сделайте патч обезьяны в своем коде (проверьте код фиксации ниже) https://github.com/jpadilla/django-rest-framework-jwt/pull/348

2) Переключиться на другую библиотеку

3) вам нужно запустить таймер в своем приложении (интерфейс) и запрашивать токен доступа каждые 5 минут до истечения срока действия. (что не идеально)

person Hemanthvrm    schedule 06.11.2019