feat: Update JWT to 75 days and remove session timeout
This commit is contained in:
1 parent
6ded3a45e4
commit
352b34e2d5
2 files changed
+2
-74
No files matched your search
@@ -18,7 +18,7 @@ exports.login = (req, res) => {
|
||||
const token = jwt.sign(
|
||||
{ id: user.id, username: user.username, role: user.role },
|
||||
process.env.JWT_SECRET,
|
||||
{ expiresIn: '30d' } // Extended for Remember Me support
|
||||
{ expiresIn: '75d' } // Extended for Remember Me support
|
||||
);
|
||||
|
||||
res.json({
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../providers/auth_provider.dart';
|
||||
import '../../screens/login/login_screen.dart';
|
||||
|
||||
class InactivityWrapper extends ConsumerStatefulWidget {
|
||||
final Widget child;
|
||||
@@ -19,77 +16,8 @@ class InactivityWrapper extends ConsumerStatefulWidget {
|
||||
}
|
||||
|
||||
class _InactivityWrapperState extends ConsumerState<InactivityWrapper> {
|
||||
Timer? _inactivityTimer;
|
||||
// 5 minutes = 300 seconds
|
||||
static const int _inactivityTimeoutSeconds = 300;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
void _resetTimer() {
|
||||
// Only run the timer if the user is logged in
|
||||
final authState = ref.read(authProvider);
|
||||
if (authState.value == null) {
|
||||
_inactivityTimer?.cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
_inactivityTimer?.cancel();
|
||||
_inactivityTimer = Timer(const Duration(seconds: _inactivityTimeoutSeconds), _handleInactivity);
|
||||
}
|
||||
|
||||
Future<void> _handleInactivity() async {
|
||||
// Guard: only act if user is still logged in
|
||||
final authState = ref.read(authProvider);
|
||||
if (authState.value == null) return;
|
||||
|
||||
// 1. Log out first (clears stored token)
|
||||
await ref.read(authProvider.notifier).logout();
|
||||
|
||||
// 2. Navigate to login screen with sessionExpired flag using the root navigator
|
||||
final navState = widget.navigatorKey.currentState;
|
||||
if (navState != null && navState.mounted) {
|
||||
navState.pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (_) => const LoginScreen(sessionExpired: true)),
|
||||
(route) => false,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// Listen to auth state changes to start/stop the timer
|
||||
ref.listen(authProvider, (previous, next) {
|
||||
if (next.value != null) {
|
||||
// User logged in, start timer
|
||||
_resetTimer();
|
||||
} else {
|
||||
// User logged out, cancel timer
|
||||
_inactivityTimer?.cancel();
|
||||
}
|
||||
});
|
||||
|
||||
return Listener(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onPointerDown: (_) => _resetTimer(),
|
||||
onPointerMove: (_) => _resetTimer(),
|
||||
onPointerUp: (_) => _resetTimer(),
|
||||
// Track keyboard activity as well
|
||||
child: Focus(
|
||||
onKeyEvent: (node, event) {
|
||||
_resetTimer();
|
||||
return KeyEventResult.ignored;
|
||||
},
|
||||
child: widget.child,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_inactivityTimer?.cancel();
|
||||
super.dispose();
|
||||
return widget.child;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user