3.1 KiB
Google OAuth2 Setup
InboxIntel logs users in with Google only. The GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET you create here identify the application to Google — every user (you or anyone else) signs in through this one credential pair. They are required; without them nobody can log in.
1. Create the OAuth client
- Go to the Google Cloud Console and create (or pick) a project.
- APIs & Services → Library → enable the Gmail API.
- APIs & Services → OAuth consent screen:
- User type: External.
- Fill app name, support email, developer email.
- Scopes: add
openid,email,profile,.../auth/gmail.readonly,.../auth/gmail.modify.
- APIs & Services → Credentials → Create credentials → OAuth client ID:
-
Application type: Web application.
-
Authorized redirect URIs — add the one(s) matching how you run it:
How you run it Redirect URI Docker (frontend on :8081) http://localhost:8081/signin-googleDocker + top-level nginx ( --profile proxy, :80)http://localhost/signin-googleLocal dev (API via dotnet run, :5080)http://localhost:5080/signin-googleProduction https://your-domain/signin-google -
Copy the generated Client ID and Client secret.
-
2. Put the credentials where the app reads them
Docker — in .env at the repo root:
GOOGLE_CLIENT_ID=xxxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=xxxxx
Local dev — use user-secrets so they never touch source control:
cd src/InboxIntel.Api
dotnet user-secrets init
dotnet user-secrets set "GoogleOAuth:ClientId" "xxxxx.apps.googleusercontent.com"
dotnet user-secrets set "GoogleOAuth:ClientSecret" "xxxxx"
3. Who is allowed to log in
This is controlled by the consent screen publishing status, not the app code (the code already creates a new user row per Google account — it does not restrict to one person):
- Testing (default): only Google accounts you add under Test users can sign in (max 100).
- In production (click Publish app): any Google account can sign in.
Caveat for the Gmail scopes
gmail.readonly and gmail.modify are restricted scopes. A published-but-unverified app still works, but:
- users see a "Google hasn't verified this app" warning screen, and
- you're capped at 100 users until Google verifies the app.
Removing the warning / going beyond 100 users requires Google's OAuth verification (a CASA security assessment for restricted scopes). For personal or small-team use, published-unverified (≤100 users) is usually fine.
4. Redirect URI must match exactly
The URI registered in the Console must character-for-character match what the app sends. The app builds it from the request's host + scheme; behind nginx, UseForwardedHeaders + the X-Forwarded-Proto/Host headers (already configured) make that the external URL, and nginx routes /signin-google to the API. If you get redirect_uri_mismatch, compare the URI in the browser's address bar during the error against what's registered.