Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import {AsyncStorage} from 'react-native';
- import moment from 'moment';
- import WarmupController from "../controllers/WarmupController";
- /**
- * This middleware is meant to be the refresher of the authentication token, on each request to the API,
- * it will first call refresh token endpoint
- * @returns {function(*=): Function}
- * @param store
- */
- const tokenMiddleware = store => next => action => {
- if (typeof action === 'object') {
- Promise.all([
- AsyncStorage.getItem('rToken'),
- AsyncStorage.getItem('eToken')
- ]).then((values => {
- if (isExpired(values[1])) {
- // this will expand the validity of our token
- WarmupController.refreshAccessToken(values[0]).then(() => {
- return next(action);
- }).catch(() => {
- return next(action);
- });
- } else {
- return next(action);
- }
- }));
- } else {
- return next(action);
- }
- };
- function isExpired(expiresIn) {
- // We refresh the token 3.5 hours before it expires(12600 seconds) (lifetime on server 25200seconds)
- return moment.unix(expiresIn).diff(moment(), 'seconds') < 12600;
- }
- export default tokenMiddleware;
- static async refreshAccessToken(rToken) {
- if (rToken) {
- let formData = new FormData();
- formData.append("refresh_token", rToken);
- return await fetch('/token/refresh',
- {
- method: 'POST',
- body: formData
- })
- .then(response => response.json())
- .then((data) => {
- let decoded = jwt_decode(data.token);
- LoginController._storeToken(data, decoded)
- .catch((err) => {
- console.log(err);
- });
- })
- .catch((err) => {
- console.log(err);
- });
- }
- }
- static _storeToken = async (uTokens, decoded) => {
- try {
- await AsyncStorage.setItem('token', uTokens.token);
- await AsyncStorage.setItem('rToken', uTokens.refresh_token);
- await AsyncStorage.setItem('eToken', decoded.exp.toString());
- } catch (err) {
- throw err;
- }
- };
- import { AsyncStorage } from 'react-native';
- import GLOBALS from '../constants/Globals';
- import {toast} from "./Toast";
- import I18n from "../i18n/i18n";
- const jsonLdMimeType = 'application/ld+json';
- export default async function (url, options = {}, noApi = false) {
- if ('undefined' === typeof options.headers) options.headers = new Headers();
- if (null === options.headers.get('Accept')) options.headers.set('Accept', jsonLdMimeType);
- if ('undefined' !== options.body && !(options.body instanceof FormData) && null === options.headers.get('Content-Type')) {
- options.headers.set('Content-Type', jsonLdMimeType);
- }
- const token = await AsyncStorage.getItem('token');
- if (token) {
- options.headers.set('Authorization', 'Bearer ' + token);
- }
- let api = '/api';
- if (noApi) {
- api = "";
- }
- const link = GLOBALS.BASE_URL + api + url;
- return fetch(link, options).then(response => {
- if (response.ok) return response;
- return response
- .json()
- .then(json => {
- if (json.code === 401) {
- toast(I18n.t("session_being_refreshed"), "success", 3000);
- }
- const error = json['message'] ? json['message'] : response.statusText;
- throw Error(I18n.t(error));
- })
- .catch(err => {
- throw err;
- });
- })
- .catch(err => {
- throw err;
- });
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement