Skip to content

Instantly share code, notes, and snippets.

@Yasir5247
Created January 17, 2024 07:01
Show Gist options
  • Save Yasir5247/8ecf80a95f78e0cf6ee0cd82b34adcfa to your computer and use it in GitHub Desktop.
Save Yasir5247/8ecf80a95f78e0cf6ee0cd82b34adcfa to your computer and use it in GitHub Desktop.
token-experiment
import {captureException} from '@sentry/react-native';
import {AuthorizeResult, refresh, RefreshResult} from 'react-native-app-auth';
import {stores} from '../../stores';
import {STORAGE_KEYS} from '../../utils/constants';
import {EFAAS_CONFIG} from '../../utils/efaasConfig';
import {saveSecureValue, getSecureValue} from '../../utils/getToken';
export const TOKEN_TO_STORAGE_KEYS = {
access: STORAGE_KEYS.ACCESS_TOKEN,
refresh: STORAGE_KEYS.REFRESH_TOKEN,
} as const;
//after login save accessToken refreshToken and expiresAt
export const saveToken = async (response: AuthorizeResult) => {
console.log('accessToken', response.accessToken);
console.log('refreshToken', response.refreshToken);
// console.log('expiresAt', response.accessTokenExpirationDate); // "2023-08-10T09:50:25Z"
//convert expiration date to milliseconds
const expiresAt = Date.parse(response.accessTokenExpirationDate);
await saveSecureValue('token', response.accessToken);
await saveSecureValue('refreshToken', response.refreshToken);
await saveSecureValue('expiresAt', String(expiresAt));
};
let refreshAccessTokenPromise: Promise<RefreshResult | null> | null = null;
export const refreshAccessToken = async (): Promise<RefreshResult | null> => {
// Check if there's an existing refresh token promise
if (refreshAccessTokenPromise) {
return refreshAccessTokenPromise;
}
try {
// Attempt to get the refresh token
const refreshToken = await getSecureValue('refreshToken');
if (!refreshToken) {
throw new Error('No refresh token present');
}
// Refresh the access token
const result: RefreshResult = await refresh(EFAAS_CONFIG, {
refreshToken: refreshToken,
});
return result;
} catch (error: any) {
console.error('refreshError', error);
console.error('error.message', error.message);
captureException(error);
if (error.message === 'invalid_grant') {
console.log('im here at invalid_grant');
stores.settingState.setRefreshTokenExpired(true);
}
return null; // Handle other errors gracefully
} finally {
// Reset the cached promise after retry attempts or errors
refreshAccessTokenPromise = null;
}
};
export const getAccessToken = async (): Promise<string | null | undefined> => {
// console.log('Im here at getAccessToken');
const accessToken = await getSecureValue('token');
const expiresAtString = await getSecureValue('expiresAt');
// console.log({accessToken, expiresAtString});
if (!accessToken || !expiresAtString) {
return null; //handle missing data gracefully
}
if (accessToken && Date.now() < Number(expiresAtString)) {
return accessToken;
}
const data = await refreshAccessToken();
saveToken(data as AuthorizeResult);
return data?.accessToken || null;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment