Skip to content

Commit

Permalink
Refresh accessToken
Browse files Browse the repository at this point in the history
  • Loading branch information
likui628 committed Oct 1, 2024
1 parent b68059d commit 03aa24d
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
30 changes: 29 additions & 1 deletion src/controllers/auth.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Request, Response } from 'express'
import { asyncHandler, successResponse } from '../utils'
import { asyncHandler, errorResponse, successResponse } from '../utils'
import { userService, authService, tokenService } from '../services'
import { User } from '@prisma/client'
import { isAfter } from 'date-fns'

async function handleTokens(user: User, res: Response) {
const { token, refreshToken } = await tokenService.generateAuthTokens(user)
Expand Down Expand Up @@ -52,3 +53,30 @@ export const logout = asyncHandler(async (req: Request, res: Response) => {
})
return successResponse(res, null, 200)
})

export const refresh = asyncHandler(async (req: Request, res: Response) => {
const cookies = req.cookies
if (!cookies?.refreshToken) {
return errorResponse(res, null, 401, 'Unauthorized')
}
const refreshToken = cookies.refreshToken as string
res.clearCookie('refreshToken', {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
})
const foundToken = await tokenService.getTokenInfo(refreshToken)
if (!foundToken) {
return errorResponse(res, null, 401, 'Unauthorized')
}
const tokenExpired = isAfter(new Date(), foundToken.expires)
if (tokenExpired) {
return errorResponse(res, null, 401, 'Unauthorized')
}

const user = await userService.getUserById(foundToken.userId)
if (!user) {
return errorResponse(res, null, 401, 'Unauthorized')
}
const token = await handleTokens(user, res)
successResponse(res, { token }, 200)
})
4 changes: 3 additions & 1 deletion src/routes/v1/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ router.post(
authController.login,
)

router.post('/logout', authController.logout)
router.get('/logout', authController.logout)

router.get('/refresh', authController.refresh)

export default router
13 changes: 13 additions & 0 deletions src/services/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,16 @@ export const getUserByEmail = async (email: string) => {
throw new Error('get user failed')
}
}

export const getUserById = async (id: string) => {
try {
const user = await prisma.user.findUnique({
where: {
id,
},
})
return user
} catch (_err: unknown) {
throw new Error('get user failed')
}
}

0 comments on commit 03aa24d

Please sign in to comment.