внедрить JWT-клиент в реагировать родной - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу внедрить клиент jwt в RN. Получение нового токена работает правильно, но когда токен истек, и я хочу обновить токен, он не работает. Это мой код функции Get:

let result = await instance
  .get(url)
  .then(({data}) => {
    if (data.error) {
      return {data: data.message, error: true, redirect: false};
    }
  return {data: data.data, error: false, redirect: false};
  })
  .catch(err => {
    if (err.response.status === 401) {
      async () => {
      let res = await this.RefreshToken().result;
      if (res) {
        return Get(url, withToken);
      } else {
        return {data: '', error: true, redirect: true};
      }
    };
  } else {
    return {data: 'Process Error', error: true, redirect: false};
  }
});

В приведенном выше коде раздел «async ()» внутри catch делаетне работа.

Это моя функция RefreshToken:

export async function RefreshToken() {
  try {
    const ref_token = await SInfo.getItem('ref_token');
    let result = await instance
      .post(
        '/refresh_token/',
        qs.stringify({
          refresh: ref_token,
        }),
      )
      .then(({data}) => {
        if (!data.error) {
          SInfo.setItem('token', data.token.access, {});
          SInfo.setItem('ref_token', data.token.refresh, {});
          return {result: true, token: data.token.access};
        } else {
          return {result: false, token: ''};
        }
      })
      .catch(error => {
        return { result: false, token: '' };
      });
  }
}

Я не знаю, в чем проблема.

1 Ответ

0 голосов
/ 09 ноября 2019

Решение выглядит примерно так:

let result = await instance
      .get(url)
      .then(({data}) => {
        if (data.error) {
          return {data: data.message, error: true, redirect: false};
        }
        return {data: data.data, error: false, redirect: false};
      })
      .catch(err => {
        if (err.response.status === 401) {
          const refreshToken = async () => {
            let res = await this.RefreshToken().result;
            if (res) {
              return Get(url, withToken);
            } else {
              return {data: '', error: true, redirect: true};
            }
          };
          refreshToken();
        } else {
          return {data: 'Process Error', error: true, redirect: false};
        }
      });

ИЛИ Я думаю, что лучшее решение:

let result = await instance
      .get(url)
      .then(({data}) => {
        if (data.error) {
          return {data: data.message, error: true, redirect: false};
        }
        return {data: data.data, error: false, redirect: false};
      })
      .catch(async (err) => {
        if (err.response.status === 401) {
          let res = await this.RefreshToken().result;
          if (res) {
            return Get(url, withToken);
          } else {
            return {data: '', error: true, redirect: true};
          }
        } else {
          return {data: 'Process Error', error: true, redirect: false};
        }
      });
...