-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtokenRefresh.js
83 lines (70 loc) · 3.07 KB
/
tokenRefresh.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
const { supabaseConection } = require('./authSupabase');
const config = require('../../config');
const refreshAccessToken = (req, res, next) => {
(async () => {
try {
// Log detallado del estado actual
/*
console.log('\n=== Refresh Token Middleware ===');
console.log('Request path:', req.path);
console.log('Cookies:', {
accessToken: req.cookies?.accessToken ? 'present' : 'missing',
refreshToken: req.cookies?.refreshToken ? 'present' : 'missing'
});
*/
if (!req.cookies?.refreshToken) {
//console.log('❌ No refresh token found');
return next();
}
// Si hay access token, verificar si está por expirar
if (req.cookies?.accessToken) {
try {
const [, payload] = req.cookies.accessToken.split('.');
const decodedToken = JSON.parse(Buffer.from(payload, 'base64').toString());
const expiresIn = decodedToken.exp * 1000 - Date.now();
//console.log(`Access token expires in: ${Math.floor(expiresIn / 1000)} seconds`);
// Si el token expira en menos de 5 minutos, refrescarlo
if (expiresIn > 5 * 60 * 1000) {
//console.log('✅ Access token still valid');
return next();
}
} catch (e) {
console.log('Error decoding token:', e);
}
}
//console.log('🔄 Attempting to refresh token...');
const { data, error } = await supabaseConection.auth.refreshSession({
refresh_token: req.cookies.refreshToken
});
if (error) {
console.error('❌ Error refreshing session:', error);
res.clearCookie('accessToken');
res.clearCookie('refreshToken');
return next();
}
if (data?.session) {
//console.log('✅ Session refreshed successfully');
// Establecer nuevas cookies
res.cookie('accessToken', data.session.access_token, {
httpOnly: true,
secure: config.nodeEnv === 'production',
sameSite: 'strict',
path: '/',
maxAge: 60 * 60 * 1000 // 1 hora
});
res.cookie('refreshToken', data.session.refresh_token, {
httpOnly: true,
secure: config.nodeEnv === 'production',
sameSite: 'strict',
path: '/',
maxAge: 7 * 24 * 60 * 60 * 1000 // 7 días
});
}
next();
} catch (error) {
console.error('❌ Error in refresh middleware:', error);
next(error);
}
})();
};
module.exports = refreshAccessToken;