218 lines
5.0 KiB
Markdown
218 lines
5.0 KiB
Markdown
# Auto-Login Debug Guide
|
|
|
|
**Date**: October 10, 2025
|
|
|
|
---
|
|
|
|
## Testing Auto-Login
|
|
|
|
### Test Scenario
|
|
|
|
1. **Login with Remember Me CHECKED**
|
|
2. **Close app completely** (swipe from recent apps)
|
|
3. **Reopen app**
|
|
4. **Expected**: Should auto-login and go to MainScreen
|
|
|
|
---
|
|
|
|
## Debug Logs to Watch
|
|
|
|
When you reopen the app, you should see these logs:
|
|
|
|
### Step 1: App Starts
|
|
```
|
|
🚀 Initializing auth state...
|
|
```
|
|
|
|
### Step 2: Check for Saved Token
|
|
```
|
|
🔍 Checking authentication...
|
|
🔍 Has token in storage: true/false
|
|
```
|
|
|
|
### If Token Found (Remember Me was checked):
|
|
```
|
|
🔍 Has token in storage: true
|
|
🔍 Token retrieved, length: 200+
|
|
✅ Token loaded from storage and set in DioClient
|
|
🚀 isAuthenticated result: true
|
|
🚀 Token found, fetching user profile...
|
|
📡 DataSource: Calling profile API...
|
|
✅ Profile loaded: Admin User
|
|
✅ Initialize complete: isAuthenticated=true
|
|
AuthWrapper build: isAuthenticated=true, isLoading=false
|
|
```
|
|
**Result**: ✅ Auto-login success → Shows MainScreen
|
|
|
|
### If No Token (Remember Me was NOT checked):
|
|
```
|
|
🔍 Has token in storage: false
|
|
❌ No token found in storage
|
|
🚀 isAuthenticated result: false
|
|
❌ No token found, user needs to login
|
|
AuthWrapper build: isAuthenticated=false, isLoading=false
|
|
```
|
|
**Result**: ✅ Shows LoginPage (expected behavior)
|
|
|
|
---
|
|
|
|
## How to Test
|
|
|
|
### Test 1: Remember Me ON → Auto-Login
|
|
```bash
|
|
1. flutter run
|
|
2. Login with Remember Me CHECKED ✅
|
|
3. Verify you see:
|
|
🔐 Repository: Token saved to secure storage (persistent)
|
|
4. Hot restart (press 'R' in terminal)
|
|
5. Should see auto-login logs
|
|
6. Should go directly to MainScreen
|
|
```
|
|
|
|
### Test 2: Remember Me OFF → Must Login Again
|
|
```bash
|
|
1. Logout from Settings
|
|
2. Login with Remember Me UNCHECKED ❌
|
|
3. Verify you see:
|
|
🔐 Repository: Token NOT saved (session only)
|
|
4. Hot restart (press 'R' in terminal)
|
|
5. Should see:
|
|
🔍 Has token in storage: false
|
|
6. Should show LoginPage
|
|
```
|
|
|
|
### Test 3: Full App Restart
|
|
```bash
|
|
1. Login with Remember Me CHECKED
|
|
2. Close app completely (swipe from recent apps)
|
|
3. Reopen app
|
|
4. Should auto-login
|
|
```
|
|
|
|
---
|
|
|
|
## Common Issues
|
|
|
|
### Issue 1: "Has token in storage: false" even after login with Remember Me
|
|
|
|
**Possible causes**:
|
|
- Backend returned error during login
|
|
- Remember Me checkbox wasn't actually checked
|
|
- Hot reload instead of hot restart (use 'R' not 'r')
|
|
|
|
**Fix**:
|
|
- Check login logs show: `Token saved to secure storage (persistent)`
|
|
- Use hot restart ('R') not hot reload ('r')
|
|
|
|
### Issue 2: Token found but profile fails
|
|
|
|
**Logs**:
|
|
```
|
|
🔍 Has token in storage: true
|
|
✅ Token loaded from storage
|
|
🚀 Token found, fetching user profile...
|
|
❌ Failed to get profile: [error message]
|
|
```
|
|
|
|
**Possible causes**:
|
|
- Token expired
|
|
- Backend not running
|
|
- Network error
|
|
|
|
**Fix**:
|
|
- Check backend is running
|
|
- Token might have expired (login again)
|
|
|
|
### Issue 3: Initialize never called
|
|
|
|
**Symptom**: No `🚀 Initializing auth state...` log on app start
|
|
|
|
**Cause**: `initialize()` not called in app.dart
|
|
|
|
**Fix**: Verify `app.dart` has:
|
|
```dart
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
ref.read(authProvider.notifier).initialize();
|
|
});
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Expected Log Flow
|
|
|
|
### On First App Start (No Token)
|
|
```
|
|
🚀 Initializing auth state...
|
|
🔍 Checking authentication...
|
|
🔍 Has token in storage: false
|
|
❌ No token found in storage
|
|
🚀 isAuthenticated result: false
|
|
❌ No token found, user needs to login
|
|
AuthWrapper build: isAuthenticated=false, isLoading=false
|
|
→ Shows LoginPage
|
|
```
|
|
|
|
### After Login (Remember Me = true)
|
|
```
|
|
REQUEST[POST] => PATH: /auth/login
|
|
📡 DataSource: Calling login API...
|
|
🔐 Repository: Starting login (rememberMe: true)...
|
|
🔐 Repository: Token saved to secure storage (persistent)
|
|
✅ Login SUCCESS
|
|
✅ State updated: isAuthenticated=true
|
|
AuthWrapper build: isAuthenticated=true, isLoading=false
|
|
→ Shows MainScreen
|
|
```
|
|
|
|
### On App Restart (Token Saved)
|
|
```
|
|
🚀 Initializing auth state...
|
|
🔍 Checking authentication...
|
|
🔍 Has token in storage: true
|
|
🔍 Token retrieved, length: 247
|
|
✅ Token loaded from storage and set in DioClient
|
|
🚀 isAuthenticated result: true
|
|
🚀 Token found, fetching user profile...
|
|
REQUEST[GET] => PATH: /auth/profile
|
|
📡 DataSource: Response...
|
|
✅ Profile loaded: Admin User
|
|
✅ Initialize complete: isAuthenticated=true
|
|
AuthWrapper build: isAuthenticated=true, isLoading=false
|
|
→ Shows MainScreen (AUTO-LOGIN SUCCESS!)
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Test Commands
|
|
|
|
```bash
|
|
# Test 1: Login with Remember Me
|
|
flutter run
|
|
# Login with checkbox checked
|
|
# Press 'R' to hot restart
|
|
# Should auto-login
|
|
|
|
# Test 2: Login without Remember Me
|
|
# Logout first
|
|
# Login with checkbox unchecked
|
|
# Press 'R' to hot restart
|
|
# Should show login page
|
|
```
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
The auto-login feature works by:
|
|
|
|
1. **On Login**: If Remember Me = true → Save token to SecureStorage
|
|
2. **On App Start**: Check SecureStorage for token
|
|
3. **If Token Found**: Load it, set in DioClient, fetch profile → Auto-login
|
|
4. **If No Token**: Show LoginPage
|
|
|
|
Use the debug logs above to trace exactly what's happening and identify any issues! 🚀
|