Check if token expired before refresh (#2101)
This commit is contained in:
		
							parent
							
								
									fd7ffb90f5
								
							
						
					
					
						commit
						1103f04f4b
					
				
							
								
								
									
										23
									
								
								lib/auth.js
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								lib/auth.js
									
									
									
									
									
								
							@ -135,6 +135,13 @@ async function resetMultiAuthCookies (req, res) {
 | 
			
		||||
  setMultiAuthCookies(req, res, { ...decoded, jwt: token })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class JwtExpiredError extends Error {
 | 
			
		||||
  constructor () {
 | 
			
		||||
    super('token expired')
 | 
			
		||||
    this.name = 'JwtExpiredError'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function refreshMultiAuthCookies (req, res) {
 | 
			
		||||
  const httpOnlyOptions = cookieOptions()
 | 
			
		||||
  const jsOptions = { ...httpOnlyOptions, httpOnly: false }
 | 
			
		||||
@ -145,8 +152,12 @@ async function refreshMultiAuthCookies (req, res) {
 | 
			
		||||
 | 
			
		||||
  const refreshToken = async (token) => {
 | 
			
		||||
    const secret = process.env.NEXTAUTH_SECRET
 | 
			
		||||
    const decoded = await decodeJWT({ token, secret })
 | 
			
		||||
    if (decoded.exp <= Date.now() / 1000) {
 | 
			
		||||
      throw new JwtExpiredError()
 | 
			
		||||
    }
 | 
			
		||||
    return await encodeJWT({
 | 
			
		||||
      token: await decodeJWT({ token, secret }),
 | 
			
		||||
      token: decoded,
 | 
			
		||||
      secret
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
@ -161,7 +172,15 @@ async function refreshMultiAuthCookies (req, res) {
 | 
			
		||||
 | 
			
		||||
    if (MULTI_AUTH_JWT_REGEXP.test(key) || key === SESSION_COOKIE) {
 | 
			
		||||
      const oldToken = value
 | 
			
		||||
      const newToken = await refreshToken(oldToken)
 | 
			
		||||
      let newToken
 | 
			
		||||
      try {
 | 
			
		||||
        newToken = await refreshToken(oldToken)
 | 
			
		||||
      } catch (err) {
 | 
			
		||||
        if (err instanceof JwtExpiredError) {
 | 
			
		||||
          continue
 | 
			
		||||
        }
 | 
			
		||||
        throw err
 | 
			
		||||
      }
 | 
			
		||||
      res.appendHeader('Set-Cookie', cookie.serialize(key, newToken, httpOnlyOptions))
 | 
			
		||||
      continue
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user