Added refresh checking logic for tokens.

This commit is contained in:
Patrick Fic
2020-01-02 09:13:55 -08:00
parent fa6a1b1eea
commit 8969108cc4
5 changed files with 63 additions and 24 deletions

View File

@@ -16,6 +16,7 @@ import { ApolloLink } from "apollo-boost";
import { ApolloProvider } from "react-apollo"; import { ApolloProvider } from "react-apollo";
import { persistCache } from "apollo-cache-persist"; import { persistCache } from "apollo-cache-persist";
import initialState from "../graphql/initial-state"; import initialState from "../graphql/initial-state";
import { shouldRefreshToken, refreshToken } from "../graphql/middleware";
class AppContainer extends Component { class AppContainer extends Component {
state = { state = {
@@ -71,6 +72,11 @@ class AppContainer extends Component {
const token = localStorage.getItem("token"); const token = localStorage.getItem("token");
// return the headers to the context so httpLink can read them // return the headers to the context so httpLink can read them
if (token) { if (token) {
console.log("checking if token should refresh.");
if (shouldRefreshToken) {
refreshToken();
}
return { return {
headers: { headers: {
...headers, ...headers,

View File

@@ -50,6 +50,8 @@ export default () => {
//add the bearer token to the headers. //add the bearer token to the headers.
localStorage.setItem("token", token); localStorage.setItem("token", token);
const now = new Date();
window.sessionStorage.setItem(`lastTokenRefreshTime`, now);
apolloClient apolloClient
.mutate({ .mutate({
@@ -61,23 +63,6 @@ export default () => {
console.log("User login upsert error.", error); console.log("User login upsert error.", error);
}); });
// apolloClient
// .query({
// query: QUERY_BODYSHOP,
// fetchPolicy: "network-only"
// })
// .then(r => {
// const bodyShopData = r.data.bodyshops[0];
// apolloClient.writeData({
// data: {
// bodyShopData: { ...bodyShopData, __typename: "bodyShopData" }
// }
// });
// })
// .catch(error => {
// console.log("Error getting bodyshop data.", error);
// });
apolloClient.writeData({ apolloClient.writeData({
data: { data: {
currentUser: { currentUser: {

View File

@@ -14,6 +14,7 @@ import {
import { UPDATE_JOB } from "../../graphql/jobs.queries"; import { UPDATE_JOB } from "../../graphql/jobs.queries";
import { useMutation } from "@apollo/react-hooks"; import { useMutation } from "@apollo/react-hooks";
import FormItemPhone from "../form-items-formatted/phone-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component";
import { useTranslation } from "react-i18next";
const formItemLayout = { const formItemLayout = {
labelCol: { labelCol: {
@@ -29,6 +30,7 @@ const formItemLayout = {
function JobTombstone({ job, ...otherProps }) { function JobTombstone({ job, ...otherProps }) {
const [jobContext, setJobContext] = useState(job); const [jobContext, setJobContext] = useState(job);
const [mutationUpdateJob] = useMutation(UPDATE_JOB); const [mutationUpdateJob] = useMutation(UPDATE_JOB);
const { t } = useTranslation();
if (!job) { if (!job) {
return ( return (
@@ -66,9 +68,10 @@ function JobTombstone({ job, ...otherProps }) {
title={"RO " + jobContext.ro_number ?? "0"} title={"RO " + jobContext.ro_number ?? "0"}
subTitle={ subTitle={
jobContext.owner jobContext.owner
? jobContext.owner?.first_name ?? ? (jobContext.owner?.first_name ?? "") +
+" " + jobContext.owner?.first_name " " +
: "No owner" (jobContext.owner?.last_name ?? "")
: t("jobs.labels.no_owner")
} }
tags={<Tag color='blue'>{jobContext?.job_status?.name}</Tag>} tags={<Tag color='blue'>{jobContext?.job_status?.name}</Tag>}
extra={[ extra={[

View File

@@ -0,0 +1,38 @@
import { auth } from "../firebase/firebase.utils";
//used to ensure that there is always a fresh token.
function minutesSince(date) {
const now = new Date();
const millisecondsSince = now - date;
// Divide milliseconds by 1000 to get seconds
// Divide seconds by 60 to get minutes
return millisecondsSince / 1000 / 60;
}
// Pass a different argument number to set a sooner/longer refresh time
export function shouldRefreshToken(minutesBeforeShouldRefresh = 45) {
const stringifiedRefreshTime = window.sessionStorage.getItem(
`lastTokenRefreshTime`
);
const lastRefreshAt = new Date(stringifiedRefreshTime);
const aboutToExpire =
minutesSince(lastRefreshAt) >= minutesBeforeShouldRefresh;
return aboutToExpire;
}
export async function refreshToken() {
console.log("Refreshing token.")
try {
if (auth.user) {
const idToken = await auth().currentUser.getIdToken(
/* force refresh */ true
);
const now = new Date();
window.localStorage.setItem(`lastTokenRefreshTime`, now);
localStorage.setItem("token", idToken);
console.log("Token refreshed.")
}
} catch (err) {
console.error(err);
}
}

View File

@@ -9,11 +9,18 @@
"labels": { "labels": {
"in": "In", "in": "In",
"out": "Out" "out": "Out"
}, }
"title": "Welcome to {{framework}}",
"greetings": "Hello2!",
"intro": "To get started, edit <1><0></0></1> and save to reload."
}, },
"jobs": {
"labels": {
"no_owner": "No Owner"
},
"fields": {
"ro_number": "RO #"
}
},
"whiteboard": { "whiteboard": {
"viewJobImages": "View Job Images", "viewJobImages": "View Job Images",
"printCenter": "Print Center", "printCenter": "Print Center",