GraphQL
Beginner
1 min read
Refresh Tokens and Secure Token Storage
Example
import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import cookieParser from 'cookie-parser';
import express from 'express';
const REFRESH_TOKEN_EXPIRY = '30d';
const ACCESS_TOKEN_EXPIRY = '15m';
const resolvers = {
Mutation: {
login: async (_, { email, password }, { res, db }) => {
const user = await authenticateUser(email, password, db);
const accessToken = jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: ACCESS_TOKEN_EXPIRY });
const refreshToken = jwt.sign({ userId: user.id }, REFRESH_SECRET, { expiresIn: REFRESH_TOKEN_EXPIRY });
// Store refresh token in httpOnly cookie
res.cookie('refresh_token', refreshToken, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'strict',
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days in ms
});
return { accessToken, user };
},
refreshToken: async (_, __, { req, res }) => {
const token = req.cookies.refresh_token;
if (!token) throw new Error('No refresh token');
const { userId } = jwt.verify(token, REFRESH_SECRET);
const user = await db.users.findById(userId);
const newAccessToken = jwt.sign({ userId }, JWT_SECRET, { expiresIn: ACCESS_TOKEN_EXPIRY });
return { accessToken: newAccessToken, user };
},
logout: (_, __, { res }) => {
res.clearCookie('refresh_token');
return true;
},
},
};
Related Resources
GraphQL Reference
Complete tag & property list
GraphQL How-To Guides
Step-by-step practical guides
GraphQL Exercises
Practice what you've learned
More in GraphQL