I am using Credentials Provider connected to Cognito User Pool.
I can’t update my access token when it expires.
I receive error : User is not authenticated.
I am using Next 14 and Next Auth 5.0.0-beta.19
I would like the access token to be renewed because I cannot force the user to log in every hour.
The access token is important because I use it as authentication for API requests.
This is my code :
export const { handlers, signIn, signOut, auth, update } = NextAuth({providers: [Credentials({credentials: {email: {},password: {},},
authorize: async (credentials): Promise<any> => {
Amplify.configure(amplifyConfig)
try {
const user: CognitoUser = await Auth.signIn(credentials.email as string, credentials.password as string)
if (!user) {
throw new Error("User not found.")
}
const session: CognitoUserSession | null = user.getSignInUserSession()
if (session) {
const accessToken = session.getAccessToken().getJwtToken()
const refreshToken = session.getRefreshToken().getToken()
const expiresAt = session.getAccessToken().getExpiration()
return { email: user.getUsername(), accessToken: accessToken, refreshToken : refreshToken, expiresAt : expiresAt }
} else {
throw new Error("No session found")
}
} catch (e) {
throw new Error("error")} }, }), ],
callbacks: {
async jwt({ token, user }: { token: any, user: any }) {
if (user) {
token.accessToken = user?.accessToken
token.refreshToken = user?.refreshToken
token.expiresAt = user?.expiresAt
}
if(token.expiresAt < Date.now() / 1000) {
try{
if(token.refreshToken){
await refreshToken(token)
}
}catch(e){
console.log("Error refreshing token", e)
}
}
return token
},
async session({ session, token }: { session: any; token: any }) {
if (token) {
session.accessToken = token?.accessToken
session.refreshToken = token?.refreshToken
session.expiresAt = token?.expiresAt
}
if(token.expiresAt < Date.now() / 1000) {
console.log("Token expired")
if(token.refreshToken){
await refreshToken(token)
}
}
return token
}
},
})
export const refreshToken = async (token: any) => {
if(token){
console.log("Token expired, refreshing")
Amplify.configure(amplifyConfig)
const user = await Auth.currentAuthenticatedUser()
console.log("User found", user)
const session = await Auth.currentSession()
user.refreshSession(session.getRefreshToken(), (err, session) => {
console.log("Session refreshed", session)
if(err){
console.log("Error refreshing session", err)
throw new Error("Error refreshing session")
}
})
console.log("Session found", session)
return { email: user.getUsername(), accessToken: session.getAccessToken().getJwtToken(), refreshToken : session.getRefreshToken().getToken() }
}
}
I also tried to do that :
export const refreshToken = async (token: any) => {
const host = "https://edillo.auth." + process.env.COGNITO_USER_POOL_REGION + ".amazoncognito.com/oauth2/token";
console.log("Host", host)
const base64 = Buffer.from(process.env.COGNITO_USER_POOL_CLIENT_ID + ":" + process.env.COGNITO_USER_POOL_CLIENT_SECRET).toString("base64")
console.log("Base64", base64)
console.log("Token in call", token)
const response = await fetch(host, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
//"Authorization": "Basic " + base64,
"grant_type": "refresh_token",
"refresh_token": token.refreshToken,
"client_id": process.env.COGNITO_USER_POOL_CLIENT_ID || "",
},
})
const data = await response.json()
console.log("Response refresh token", data)
}
but i receive { error: 'invalid_request' }
Paolo Lorizzo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.