docs(runbook): diagnose Google OAuth 403 org_internal and document protected remediation - #1064
Conversation
…ument protected remediation Google sign-in at uvai.io fails with Error 403: org_internal for consumer accounts because the OAuth client's consent screen User type is Internal in Google Cloud Console. Document the root cause, the human-owned remediation (switch Audience to External and publish or add test users), the externally verified state of the production authorize flow (canonical redirect_uri, PKCE, state all correct), and the OAuth error fingerprints to watch. Generated with [Linear](https://linear.app/myxstack/issue/GRV-88/execution-verify-google-oauth-in-vercel-production-pr-903#agent-session-05438499) Co-authored-by: linear-code[bot] <222613912+linear-code[bot]@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are limited based on label configuration. 🏷️ Required labels (at least one) (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository YAML (base), Repository UI (inherited), Organization UI (inherited) Review profile: ASSERTIVE Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Comment |
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Snapshot WarningsEnsure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice. Scanned FilesNone |
Agent Completion Truth Gate: BLOCKEDReasons: Machine-readable verdict{
"details": {
"collection_errors": [
"incomplete_linked_issue_contract",
"missing_closing_issue_reference",
"missing_intent_snapshot",
"agent_run_id_mismatch",
"agent_login_mismatch"
],
"identity_projection": {
"agent_login": "google-labs-jules[bot]",
"issue_number": 900,
"run_id": "15243187445261469621"
},
"missing_declared_files": [
".env.example",
"apps/web/.env.example",
"apps/web/src/app/login/GoogleSignInButton.tsx",
"apps/web/src/app/login/page.tsx",
"apps/web/src/lib/__tests__/auth-config-source.test.ts",
"apps/web/src/lib/auth.ts"
]
},
"reasons": [
"evidence_collection_failed",
"missing_declared_files",
"missing_agent_result",
"missing_copilot_current_head_review",
"missing_copilot_rabbit_label",
"required_checks_failed",
"draft_pr"
],
"verdict": "blocked"
} |
|
Execution-controller reconciliation — 2026-07-28T14:05Z This PR is retained as draft evidence only and receives no active-execution or #898 delivery credit.
The newly proven protected action remains: a Google Cloud owner must change the production OAuth consent-screen audience from Internal to External, then publish the app or add intended test users and complete a real sign-in/callback. Execution receipt:
|
Closing — branch orphaned by the secret-purge force-pushNo common ancestor with current This is documentation — the Google OAuth 403 Branch retained for archive-tagging. Generated by Claude Code |
Canonical issue
Progresses #900 (does not close it — protected human steps remain). Canonical implementation PR for env-var precedence remains #903; this PR does not compete with it.
Outcome
Operators get a runbook diagnosis of the active production blocker — Google sign-in failing with
Error 403: org_internal— plus the exact human-owned remediation (Google Cloud Console consent screen: switch Audience/User type from Internal to External, then publish or add test users), the externally verified state of the production authorize flow, and the OAuth error fingerprints to watch.Scope
docs/deployment/VERCEL_PRODUCTION_RUNBOOK.mdonly.apps/web/src/lib/auth.ts, login pages, or env examples (owned by canonical PR fix(auth): restore Google OAuth configuration in Vercel production #903); any Google Cloud / Vercel configuration change (protected).Risk
Verification
https://uvai.io/login(2026-07-28, no credentials): the Google button redirects to Google's authorize endpoint withredirect_uri=https://uvai.io/api/auth/callback/google(exact canonical URI),scope=openid email profile, PKCE S256, andstate— noredirect_uri_mismatch/invalid_clientat this step.Production evidence
org_internalis emitted by Google's authorization server based on the OAuth client's consent-screen audience; it cannot be fixed or fully verified from repository code, and Google blocks non-interactive browsers before password entry. A real sign-in/callback after the console change remains a protected human step (documented in the runbook section).Agent handoff
Agent provenance