Source

helpers/JWTUtil.js

import '../models/auth';
/*
  This is a collection of utility functions for working with JWT tokens
*/

export const decodeBase64Token = (tokenBase64String) => {
  try {
    const token = 
      JSON.parse(
        atob(
          tokenBase64String.replace(/-/g, '+').replace(/_/g, '/') // The replace is needed because the token is base64url encoded and not base64 encoded
        )
      );
    return token;
  } catch (err) {
    return null;
  }
};

export const decodeTokenToJWT = (token) => {
  const spilt = token.includes('.') ? token.split('.')[1] : token;
  const jwt = JSON.parse(
    atob(
      spilt.replace(/-/g, '+').replace(/_/g, '/') // The replace is needed because the token is base64url encoded and not base64 encoded 
    )
  );
  return jwt;
};

/**
 * @function parseTokens
 * @param {string} tokensB64
 * @returns {ParsedUserToken}
 */
export const parseTokens = (tokensB64) => {
  const token = decodeBase64Token(tokensB64) || {};
  const {id_token, access_token} = token;
  const idToken = decodeTokenToJWT(id_token || access_token) || {};
  const accessToken = decodeTokenToJWT(access_token) || {};

  let userName = 'User';
  const {given_name, family_name, email, name} = idToken;
  if (given_name) {
    userName = given_name;
    if (family_name) {
      userName += ' ' + family_name;
    }
  }
  else if (name) {
    userName = name;
  }
  else if (email) {
    userName = email;
  }

  return {
    token,
    accessToken,
    isExpired: () => { console.log(accessToken.exp); return accessToken.exp < (Date.now() / 1000);},
    timeToExpired: () => { return accessToken.exp - (Date.now() / 1000);}, // This should return the time in seconds until the token expires, we can use this to refresh the token
    idToken: idToken,
    user: {
      authenticated: true,
      name: userName,
      email,
      given_name,
      family_name,
      id: idToken.sub,
      sub: idToken.sub,
      raw: idToken // So we can use other claims if we want
    },
    refresh_token: token.refresh_token
  };
};