feat: Google Drive OAuth via http://localhost redirect (no public domain required)

- Switch redirect URI from server IP to http://localhost (works everywhere)
- Add manual code exchange flow: user copies URL from browser, pastes in app
- New PHP action gdrive_oauth_exchange to exchange auth code for refresh token
- Fix  null bug in gdrive_oauth_exchange (was read before initialization)
- Add #gdrive-code-section UI with input + submit button in index.html
- Update _gdriveAuthorize() to show code section and store redirect_uri
- Add _gdriveSubmitCode() JS function for manual code submission
- Update setup wizard and backup tab to show http://localhost as redirect URI
- Add 5 new translation keys (gdrive_redirect_uri_hint, gdrive_code_title,
  gdrive_code_hint, gdrive_code_submit, gdrive_code_empty) in all 5 languages
- Update gdrive_oauth_steps in all translations to reflect new flow
- Document Google Drive OAuth setup in README.md
- Dark mode: comprehensive fix for 30+ components with hardcoded light colors
This commit is contained in:
dadaloop82
2026-05-18 18:41:56 +00:00
parent 4515ff7246
commit 7364e75881
10 changed files with 1364 additions and 11 deletions
+47
View File
@@ -762,6 +762,53 @@
"card_hint": "During cooking, show tips on how to reuse scraps generated in each step (peels, cooking water, etc.). Disabled by default.",
"label": "Show tips during cooking"
},
"backup": {
"tab": "Backup",
"local_title": "Local Backup",
"local_hint": "Daily database snapshot. Configure how many days of backups to keep.",
"enabled": "Enable daily automatic backup",
"retention_days": "Retention (days)",
"retention_info": "Backups are kept for",
"backup_now": "Backup Now",
"backing_up": "Backing up…",
"backed_up": "Backup complete",
"backup_error": "Backup error",
"last_backup": "Last backup",
"no_backup_yet": "No backup has been created yet",
"list_empty": "No backups available",
"restore_btn": "Restore",
"restore_confirm": "Restore backup",
"delete_btn": "Delete",
"delete_confirm": "Delete backup",
"gdrive_title": "Google Drive",
"gdrive_hint": "Automatically back up to Google Drive via OAuth 2.0. No external libraries required.",
"gdrive_enabled": "Enable Google Drive backup",
"gdrive_folder_id": "Drive Folder ID",
"gdrive_folder_id_hint": "Copy the ID from the Drive folder URL: …/folders/<strong>ID</strong>",
"gdrive_retention_days": "Drive retention (days, 0=keep all)",
"gdrive_test": "Test Connection",
"gdrive_ok": "Connection successful!",
"gdrive_error": "Connection failed",
"gdrive_push_now": "Upload to Drive Now",
"gdrive_pushing": "Uploading…",
"gdrive_pushed": "Uploaded to Drive",
"gdrive_wizard_hint": "Optional: automatically back up to Google Drive daily via OAuth 2.0.",
"gdrive_skip": "Skip — configure later in Settings",
"gdrive_client_id": "Client ID",
"gdrive_client_secret": "Client Secret",
"gdrive_redirect_uri_hint": "Add <strong>http://localhost</strong> as an authorized redirect URI in Google Cloud Console. This works on any server, even without a public domain.",
"gdrive_code_title": "Paste the authorization URL or code",
"gdrive_code_hint": "After authorizing, the browser will open http://localhost and may show a connection error — that is expected. Copy the URL from the address bar (e.g. <code>http://localhost/?code=4%2F0A...</code>) and paste it here.",
"gdrive_code_submit": "Submit",
"gdrive_code_empty": "Paste the URL or authorization code first",
"gdrive_redirect_uri_label": "Redirect URI (add this in Google Cloud Console):",
"gdrive_oauth_authorize": "Authorize with Google",
"gdrive_oauth_authorized": "Authorized",
"gdrive_oauth_not_authorized": "Not authorized yet",
"gdrive_oauth_window_opened": "Browser window opened — authorize and come back",
"gdrive_oauth_how_to": "How to set up OAuth 2.0 (step by step)",
"gdrive_oauth_steps": "<li>Go to <a href='https://console.cloud.google.com/' target='_blank' rel='noopener'>console.cloud.google.com</a> and select your project</li><li>Enable the <strong>Google Drive API</strong>: <em>APIs &amp; Services → Enable APIs → Google Drive API</em></li><li>Go to <em>APIs &amp; Services → Credentials → Create Credentials → OAuth client ID</em></li><li>Application type: <strong>Web application</strong>; add <strong>http://localhost</strong> as an <em>Authorized redirect URI</em></li><li>Copy the <strong>Client ID</strong> and <strong>Client Secret</strong> into the fields above and save</li><li>Click <strong>Authorize with Google</strong>, sign in and grant access</li><li>The browser will open <code>http://localhost</code> (a connection error is expected): copy the URL from the address bar and paste it in the field that appears below</li>"
},
"info": {
"tab": "Info",
"ai_title": "Gemini AI — Token Usage",