@mantlejs/auth-google
Google OAuth 2.0 strategy for Mantle JS. Implements the authorization code flow with PKCE — no Passport.js dependency. Registers GET /auth/google and GET /auth/google/callback on the configured HTTP transport (@mantlejs/express, @mantlejs/koa, or @mantlejs/http), then finds or creates a user record and returns a Mantle JWT pair.
Installation
Section titled “Installation”npm install @mantlejs/auth-googleConcepts
Section titled “Concepts”Google Sign-In uses the authorization code flow with PKCE (Proof Key for Code Exchange). On each redirect request the plugin generates a fresh code_verifier (via Arctic, which also derives the SHA-256 / base64url code_challenge — see ADR-002). The verifier is stored server-side against a random state token and passed to the token exchange on callback.
Find-or-create
Section titled “Find-or-create”On callback the plugin searches the configured user service for a record where googleId (configurable) matches the sub claim from Google’s userinfo endpoint. If no record is found, it creates one with { googleId, email, name } from the profile. The same user is returned on every subsequent sign-in.
Quick start
Section titled “Quick start”import { mantle } from "@mantlejs/mantle";import { express } from "@mantlejs/express";import { auth } from "@mantlejs/auth";import { googleStrategy } from "@mantlejs/auth-google";
const app = mantle() .configure(express()) .configure(auth({ secret: process.env.JWT_SECRET! })) .configure(googleStrategy({ clientId: process.env.GOOGLE_CLIENT_ID!, clientSecret: process.env.GOOGLE_CLIENT_SECRET!, }));
app.listen(3030);Sign-in flow:
- Redirect the browser to
GET /auth/google - User authenticates on Google and consents
- Google redirects to
GET /auth/google/callback?code=...&state=... - The plugin exchanges the code, fetches the profile, finds or creates the user, and responds:
{ "accessToken": "eyJhbGciOiJIUzI1NiJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiJ9...", "user": { "id": "1", "googleId": "108...", "email": "alice@gmail.com", "name": "Alice" }}googleStrategy(config)
Section titled “googleStrategy(config)”function googleStrategy(config: GoogleStrategyConfig): MantlePlugin;
type GoogleStrategyConfig = { clientId: string; clientSecret: string; callbackUrl?: string; // Default: '/auth/google/callback' scope?: string[]; // Default: ['openid', 'profile', 'email'] entity?: string; // Default: 'users' entityIdField?: string; // Default: 'googleId'};| Field | Type | Default | Description |
|---|---|---|---|
clientId |
string |
— | Google OAuth client ID (required) |
clientSecret |
string |
— | Google OAuth client secret (required) |
callbackUrl |
string |
'/auth/google/callback' |
Callback path — must match the redirect URI registered in Google Cloud Console |
scope |
string[] |
['openid', 'profile', 'email'] |
Google OAuth scopes |
entity |
string |
'users' |
Mantle service used to find or create users |
entityIdField |
string |
'googleId' |
Field on the user record matched against Google’s sub claim |
redirectUrl |
string |
none — returns JSON | Frontend URL to redirect to on completion, with tokens (or an error) in the URL fragment — see @mantlejs/auth-oauth |
Routes registered:
| Method | Path | Description |
|---|---|---|
GET |
/auth/google |
Redirect to Google consent screen |
GET |
/auth/google/callback |
Handle callback, issue Mantle JWT pair |
Must be configured after an HTTP transport (@mantlejs/express, @mantlejs/koa, or @mantlejs/http) and auth().
import type { GoogleStrategyConfig } from "@mantlejs/auth-google";GoogleStrategyConfig is an alias for OAuthPluginConfig from @mantlejs/auth-oauth.
Google Cloud Console setup
Section titled “Google Cloud Console setup”No API needs to be enabled — this strategy calls Google’s OpenID Connect userinfo endpoint
directly for the openid/profile/email scopes, not the (long since shut down) Google+ API
or the People API.
- Create a project at console.cloud.google.com
- Under Google Auth Platform → Branding, configure the app name and support email, then
under Audience set the publishing status.
openid,email, andprofileare non-sensitive scopes that don’t require verification. If the app stays in Testing mode, add your own Google account under Audience → Test users or sign-in will be blocked. - Under Google Auth Platform → Clients, create a client (application type Web application)
- Add the callback URL to Authorized redirect URIs:
https://your-domain.com/auth/google/callback - Copy the Client ID and Client Secret into your environment
(Google has renamed/reshuffled this console section before and may again — if these labels have drifted, look for “OAuth consent screen”/“Branding” and “Credentials”/“Clients”; the underlying steps are the same.)
Development
Section titled “Development”npx nx build auth-google # compilenpx nx test auth-google # run testsnpx nx lint auth-google # lintPublishing
Section titled “Publishing”npx nx build auth-googlecd packages/auth-googlenpm publish --access public