Skip to content

Allow gws auth login to work with OAuth clients that don't register userinfo.profile #770

@KimYannn

Description

@KimYannn

Environment

  • gws version: 0.22.5 (built from main at commit a3768d0)
  • OS: macOS 25.4.0 (also reproduces on Linux)
  • gcloud SDK installed and authenticated

What I'm trying to do

Use the gcloud SDK's well-known public Desktop OAuth client (32555940559.apps.googleusercontent.com) as gws's OAuth client, so I don't have to create a separate GCP project + OAuth client just to try gws.

export GOOGLE_WORKSPACE_CLI_CLIENT_ID=32555940559.apps.googleusercontent.com
export GOOGLE_WORKSPACE_CLI_CLIENT_SECRET=ZmssLNjJy2998hD4CTg2ejr2  # public, ships in gcloud SDK
gws auth login --readonly -s drive

What happens

OAuth flow fails with:

error: restricted_client
error_description: The OAuth client was disabled.

Login never completes; no credentials are saved.

Why

handle_login_inner at crates/google-workspace-cli/src/auth_commands.rs (around line 600) unconditionally appends three identity scopes to every login request:

let identity_scopes = [
    "openid",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/userinfo.profile",
];

https://www.googleapis.com/auth/userinfo.profile is not registered on gcloud's public Desktop OAuth client (verified by inspecting ~/.config/gcloud/credentials.db — the scope list there does not include userinfo.profile). Google's OAuth endpoint rejects the whole request with restricted_client.

The same applies to gcloud's ADC client (764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com).

Expected behaviour

One of:

  • (a) gws detects that the requested OAuth client cannot grant userinfo.profile and gracefully drops it (with a warning), letting login succeed.
  • (b) Login is attempted; on restricted_client, gws retries without the offending identity scope and warns the user.
  • (c) Documentation explicitly says "you must register your own OAuth client; gcloud's public client is unsupported."

Today the failure mode is opaque — no hint that userinfo.profile is the offending scope, no suggested workaround.

Workaround I'm using locally

Removed userinfo.profile from the forced identity-scope list. Login succeeds; fetch_userinfo_email still works (only userinfo.email is needed for the email lookup); only the People-API display-name fallback path in Gmail send-as is affected.

Possible fixes (in order of robustness)

  1. Try-then-fallback — request profile by default; on restricted_client retry without it. No hardcoded client_id list. Self-healing if Google ever changes which scopes a client supports.
  2. Auto-detect known restricted clients — keep a small list of gcloud's public client_ids and skip userinfo.profile for them. Brittle if Google rotates client_ids, but simple.
  3. Document only — recommend gws auth setup for a dedicated client; document why gcloud's public client doesn't work.

Happy to send a PR for whichever direction you'd like. I have a working local patch implementing option 2 with auto-detect; option 1 would take a bit more work but is cleaner long-term.

Related

  • The userinfo.profile scope was added to identity scopes as a fallback for People API display-name lookup in Gmail send-as. Dropping it doesn't break the primary login flow, only that secondary feature when the user has a Workspace account without a configured display name.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions