How to make user logout upon token expiration in react native?

Viewed 53

This is the token manager. All the necessary imports have been made. The token is stored in the async storage. I need to make user logout upon token expiration since the app is returning undefined whenever token expires in a day or two. And it's generating problem since upon expiration, the app only shows the loader screen and the user couldn't logout themselves.

const TokenManager = {
  restoreNewToken: async () => {
    const modelData = {
      client_id: TokenConfig.client_id,
      client_secret: TokenConfig.client_secret,
      grant_type: TokenConfig.grant_type,
    };
    const token = await DeviceStorage.getKey('token');
    const login_flag = await DeviceStorage.getKey('isloggedIn');
    const current_time = new Date().getTime() / 1000;

    if (login_flag === 'true') {
      //USER IS LOGIN
      const jwt = jwt_decode(token);

      if (current_time > jwt.exp) {
        try {
          //IF LOGIN ACCESS TOKEN IS EXPIRED
          const refresh_token = await DeviceStorage.getKey('refresh_token');

          var res = await axios.post(
            AppUrl.RefreshToken,
            qs.stringify({RefreshToken: refresh_token}),
            {
              headers: {'content-type': 'application/x-www-form-urlencoded'},
            },
          );
          let data = await res.data;
          if (data.error === 'invalid refresh token') {
            //IF INVALID REFRESH TOKEN: CLEAR ALL SAVED DATA AND GENERATE NEW ACCESS TOKEN
            await DeviceStorage.clearToken();
            const newToken = await DeviceStorage.getKey('refresh_token');
            var res = await axios.post(
              AppUrl.RefreshToken,
              qs.stringify(newToken),
            );
            let refresh_token_data = await res.data;
            await DeviceStorage.saveKey(
              'token',
              refresh_token_data.access_token,
            );

            return true;
          } else {
            //ELSE GENERATE NEW ACCESS TOKEN FOR LOGIN USER: IF REFRESH TOKEN IS EXPIRED
            var res = await axios.post(
              AppUrl.GetTemporaryToken,
              qs.stringify(modelData),
            );
            let temp_token = await res.data;
            await DeviceStorage.saveKey('token', data.access_token);
            return true;
          }
        } catch (error) {
          return false;
        }
      } else {
        //IF LOGIN TOKEN NOT EXPIRED: DO NOTHING
        return true;
      }
    } else {
      /**
       * if user is not login
       */
      if (token === null) {
        var res = await axios.post(
          AppUrl.GetTemporaryToken,
          qs.stringify(modelData),
          {
            headers: {'content-type': 'application/x-www-form-urlencoded'},
          },
        );
        let data = await res.data;
        await DeviceStorage.saveKey('token', data.access_token);
        return true;
      } else {
        try {
          const jwt = jwt_decode(token);
          if (current_time > jwt.exp) {
            //GENERATE NEW TEMPORARY TOKEN IF EXPIRED
            var res = await axios.post(
              AppUrl.GetTemporaryToken,
              qs.stringify(modelData),
            );
            let data = await res.data;
            await DeviceStorage.saveKey('token', data.access_token);
            return true;
          } else {
            //IF TEMPORARY TOKEN IS NOT EXPIRED.
            return true;
          }
        } catch (error) {
          console.log('error else', error);
          return false;
        }
      }
    }
  },

  clearAndRestoreNewToken: async () => {
    try {
      await DeviceStorage.clearToken();
      const modelData = {
        client_id: TokenConfig.client_id,
        client_secret: TokenConfig.client_secret,
        grant_type: TokenConfig.grant_type,
      };
      var res = await axios.post(
        AppUrl.GetTemporaryToken,
        qs.stringify(modelData),
      );
      let data = await res.data;
      await DeviceStorage.saveKey('token', data.access_token);

      if (data) {
        await DeviceStorage.saveKey('token', data.access_token);
        return true;
      }
    } catch (error) {
      console.log('error message', error)
      return false;
    }
  },
};

export default TokenManager;
0 Answers
Related