I am using apollo server to set cookies in response headers after a user successfully logs in.
const { accessToken, refreshToken } = getNewTokens(user);
res.cookie("access-token", accessToken);
res.cookie("refresh-token", refreshToken);
On my client side I am using react and this is how I handle the login form submission
const formik = useFormik({
initialValues: {
usernameOrEmail: "",
password: "",
},
onSubmit: async ({ usernameOrEmail, password }) => {
const {
data: {
login: { error },
},
} = await login({
variables: {
usernameOrEmail,
password,
},
});
if (error) {
setResErr(error);
} else {
setResErr(null);
history.push("/group/1");
}
},
I have defined /group/1 as a private route and this is how routing is done
<ApolloProvider client={client}>
<Router>
<Route path="/register" exact component={Register} />
<Route path="/login" exact component={Login} />
<PrivateRoute path="/profile/:userId" exact component={Profile} />
<PrivateRoute path="/group/:groupId" exact component={Group} />
<PrivateRoute path="/chat/:userId" exact component={Chat} />
</Router>
</ApolloProvider>,
The PrivateRoute component looks like this
const PrivateRoute = ({ component: Component, ...rest }) => {
const user = getUserfromCookie();
return (
<Route
{...rest}
render={(props) =>
user && user.userId ? (
<React.Fragment>
<Navbar />
<Component {...props} />
</React.Fragment>
) : (
<Redirect to="/login" />
)
}
/>
);
};
This is the getCookies function
export const getCookies = () => {
let accessToken, refreshToken;
try {
accessToken = Cookies.get("access-token");
refreshToken = Cookies.get("refresh-token");
} catch (err) {
return { accessToken: null, refreshToken: null };
}
return { accessToken, refreshToken };
};
export const getUserfromCookie = () => {
const { accessToken } = getCookies();
let user = null;
try {
user = decode(accessToken);
} catch (err) {
console.log(err);
}
return user;
};
Now when I successfully submit the form I am hoping that the cookies will be set and I will be redirected. But when I see my console the cookies are set Console image
however, I am not being redirected to the group's page.
But if I refresh the login page and enter the credentials again it works just as expected.
I tried to call the getUserfromCookie after form submission ie
const {
data: {
login: { error },
},
} = await login({
variables: {
usernameOrEmail,
password,
},
});
console.log(getUserfromCookie());
if (error) {
setResErr(error);
} else {
setResErr(null);
history.push("/group/1");
}
and it does display the user.
I also tried logging its output inside the PrivateRoute component but I see nothing on the console perhaps because it quickly reroutes to the login page.
Am I doing something wrong here?