Как мне сделать refre sh логин токена авторизации с ax ios для нескольких запросов? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытался сделать это так, но для трех запросов он отправляет три refre sh запросов:

  • 1, 2, 3 завершается неудачно с 401
  • refre sh успех, 1 успех, 2, 3 ошибки
  • refre sh успех, 2 успеха, 3 ошибки
  • refre sh успех 3 успеха

Я не могу поставить такую ​​большую нагрузку на мобильное устройство (даже если было только 3 refre sh без «refail»)

Вот мой код:

function requestRefreshToken(refreshToken, accessToken) {
  return axios
    .create({
      baseURL: apiUrl + Endpoints.AUTH.REFRESH,
      skipAuthRefresh: true,
      headers: {
        'Accept-Language': 'ru',
        'User-Agent': `${Platform.OS} ${packageJson.version}`,
        Authorization: accessToken,
      },
    })
    .post(
      '',
      {
        grant_type: GrantTypes.REFRESH_TOKEN,
        refresh_token: refreshToken,
        client_id: Client.id,
        client_secret: Client.secret,
      },
      { validateStatus },
    );
}

const refreshAuthLogic = async failedRequest =>
  Keychain.getCredentials()
    .then(old => requestRefreshToken(old.refreshToken, old.accessToken))
    .then(({ data: credentials }) => {

      failedRequest.config.headers.Authorization = `${credentials.token_type} ${
        credentials.access_token
      }`;

      return Keychain.setCredentials(credentials);
    });

createAuthRefreshInterceptor(axios, refreshAuthLogic, {
  retryInstance: axios,
  skipWhileRefreshing: true,
  onRetry: function(config) {
    return Keychain.getCredentials().then(({ accessToken }) =>
      axios({
        ...config,
        header: { ...config.headers, Authorization: accessToken },
      }),
    );
  },
});

axios.interceptors.response.use(
  r => r,
  request => {
    if (request.response.status === 401) {
      return Keychain.getCredentials().then(({ accessToken }) =>
        axios({
          ...request.config,
          header: { ...request.config.headers, Authorization: accessToken },
        }),
      );
    }
  },
);

1 Ответ

0 голосов
/ 23 февраля 2020

Решено с этим! Кажется, что нет способа решить его без очереди невыполненных запросов (https://gist.github.com/mkjiau/650013a99c341c9f23ca00ccb213db1c

...