Files
tabungin/GOOGLE_AUTH_PASSWORD_SOLUTION.md
dwindown 249f3a9d7d feat: remove OTP gate from transactions, fix categories auth, add implementation plan
- Remove OtpGateGuard from transactions controller (OTP verified at login)
- Fix categories controller to use authenticated user instead of TEMP_USER_ID
- Add comprehensive implementation plan document
- Update .env.example with WEB_APP_URL
- Prepare for admin dashboard development
2025-10-11 14:00:11 +07:00

5.9 KiB

Google Auth Password Solution - COMPLETE

🎯 Problem Solved:

Issue 1: Google Users Can't Change Password

  • Google OAuth users have no password in database
  • "Change Password" card shows error

Issue 2: Google Users Can't Delete Account

  • Account deletion requires password verification
  • Google users blocked from deletion

Solution Implemented:

1. Set Password for Google Users

UI Changes:

  • Card title: "Set Password" (instead of "Change Password")
  • Description: "Set a password to enable password-based login and account deletion"
  • Info alert explaining benefits
  • No "Current Password" field (Google users don't have one)
  • Only "New Password" and "Confirm Password"

Backend Endpoint Needed:

POST /api/auth/set-password
Body: { newPassword: string }
// Creates password hash for Google user
// Allows email/password login

2. Conditional Password UI

For Google Users:

  • Title: "Set Password"
  • No current password field
  • Alert: "Your account uses Google Sign-In. Setting a password will allow you to login with email/password and delete your account if needed."
  • Button: "Set Password"

For Email/Password Users:

  • Title: "Change Password"
  • Current password field required
  • Button: "Update Password"

3. Account Deletion Protection

For Google Users WITHOUT Password:

  • Shows alert: "You must set a password first before you can delete your account. Go to 'Set Password' above."
  • Delete button disabled

For Users WITH Password:

  • Normal deletion flow
  • Password confirmation required

📊 Cross-Authentication:

Question: Can Google user login with email/password?

Answer: YES, after setting password!

How It Works:

Before Setting Password:

User: dewe.pw@gmail.com
Auth Methods: [Google OAuth only]
Password Hash: null
Login Options: Google button only

After Setting Password:

User: dewe.pw@gmail.com
Auth Methods: [Google OAuth, Email/Password]
Password Hash: $2b$10$...
Login Options: Google button OR email/password

Reverse: Can email/password user login with Google?

Answer: YES, if same email!

When user clicks "Continue with Google":

  1. Google returns email: dewe.pw@gmail.com
  2. Backend finds existing user with that email
  3. Creates Google OAuth link
  4. User now has both methods

🔧 Backend Requirements:

1. GET /api/auth/accounts - Check auth methods

Response: {
  accounts: [
    { provider: 'google', ... }
  ],
  hasPassword: boolean  // NEW: Check if password exists
}

2. POST /api/auth/set-password - Set password for Google user

Body: { newPassword: string }

Steps:
1. Check user has no password (passwordHash === null)
2. Hash new password
3. Update user.passwordHash
4. Return success

Response: {
  success: true,
  message: "Password set successfully"
}

3. POST /api/auth/change-password - Change existing password

Body: {
  currentPassword: string,
  newPassword: string
}

Steps:
1. Verify current password
2. Hash new password
3. Update passwordHash
4. Return success

💡 User Flow:

Google User Wants to Delete Account:

Step 1: Try to delete

  • See alert: "You must set a password first"

Step 2: Set password

  • Go to "Set Password" card
  • Enter new password
  • Click "Set Password"
  • Success: "Password set successfully!"

Step 3: Delete account

  • Go back to Danger Zone
  • Click "Delete Account"
  • Enter password (the one just set)
  • Account deleted

Google User Wants Email/Password Login:

Step 1: Set password (same as above)

Step 2: Login with email/password

  • Go to login page
  • Enter email: dewe.pw@gmail.com
  • Enter password (the one set)
  • Login successful

Step 3: Still can use Google

  • Click "Continue with Google"
  • Still works!

🎨 UI Features:

Password Card:

  • Conditional title (Set vs Change)
  • Conditional description
  • Info alert for Google users
  • Conditional fields (no current password for Google)
  • Conditional button text
  • Different success messages

Danger Zone:

  • Check if password exists
  • Show alert if no password
  • Disable delete for Google users without password
  • Enable delete after password set

ESLint: Clean

npm run lint
# ✓ 0 errors, 0 warnings

🧪 Testing:

Google User Flow:

  1. Login with Google
  2. Go to Security tab
  3. See "Set Password" card
  4. See info alert about Google Sign-In
  5. No "Current Password" field
  6. Enter new password + confirm
  7. Click "Set Password"
  8. Success message appears
  9. Page reloads
  10. Card now shows "Change Password"
  11. "Current Password" field appears
  12. Go to Danger Zone
  13. No alert about setting password
  14. Can delete account

Email/Password User Flow:

  1. Register with email/password
  2. Go to Security tab
  3. See "Change Password" card
  4. See "Current Password" field
  5. Enter current + new + confirm
  6. Click "Update Password"
  7. Success message
  8. Can delete account

Cross-Authentication:

  1. Google user sets password
  2. Logout
  3. Login with email/password
  4. Logout
  5. Login with Google
  6. Both methods work!

📝 Summary:

Problem: Google users can't change password or delete account

Solution:

  1. "Set Password" feature for Google users
  2. Conditional UI based on auth method
  3. Password requirement for account deletion
  4. Cross-authentication support

Benefits:

  • Google users can set password
  • Google users can delete account
  • Users can login with multiple methods
  • Flexible authentication system
  • Better UX

Frontend: Complete Backend: Needs implementation


Ready for backend implementation! 🚀