Authentication
Google sign-in, cookies, refresh rotation, and logout
Peridot ID authentication is cookie-based. After a successful Google sign-in the API
sets two HttpOnly cookies on your domain.
The two cookies
| Cookie | Purpose | Lifetime | Path |
|---|---|---|---|
peridot_access | JWT access token, sent with every request | 15 minutes | / |
peridot_refresh | Rotating refresh token, only used to mint new access tokens | 30 days | /v1/auth |
Both are HttpOnly; SameSite=Lax. In production the Secure flag is also set, so they
are only sent over HTTPS.
Sign-in flow
Browser Peridot ID Google
│ POST /v1/auth/login │ │
│ ← {"url": "/v1/auth/google"} │
│ GET /v1/auth/google ──►│ 302 ─────────────────►│ consent screen
│ ◄────────────────────── │ │
│ ◄───────────────────────────── 302 + auth code ── │
│ GET /v1/auth/google/callback?code=... │
│ │ exchange code, create or link identity
│ ◄─ 302 CLIENT_SUCCESS_URL + peridot_access + peridot_refresh cookies- Call
POST /v1/auth/login(or use the SDK) to get the Google authorization URL. - Navigate the browser to that URL. The user consents on Google.
- Google redirects to
GET /v1/auth/google/callback?code=.... The API exchanges the code, creates or links the identity, and issues both session cookies. - The browser lands on
CLIENT_SUCCESS_URLwith a logged-in session.
For a first-time sign-in the API creates an identity, a profile (pre-filled from the Google account), and a linked auth account. Subsequent sign-ins link to the same identity.
Note:
GET /v1/auth/googleand/v1/auth/google/callbackare browser-navigation only. They respond with302redirects that afetch()/Swagger "Send" call cannot follow (the cross-origin redirect to Google is CORS-blocked, showingFailed to fetch). Always open the login URL in a browser tab — never call these two endpoints from JavaScript.
Refreshing tokens
The access token expires after 15 minutes. Instead of asking the user to log in again,
call POST /v1/auth/refresh. It:
- Verifies the current
peridot_refreshcookie. - Revokes it (rotation) and issues a new access + refresh pair as cookies.
Because each refresh token can be used exactly once, a stolen token that is replayed after rotation is rejected.
curl -b cookies.txt -c cookies.txt -X POST https://api.peridot.id/v1/auth/refresh
# 204 No Content — new cookies set, old refresh token revokedIf this returns 401, the refresh token is invalid, expired, or already rotated — the
user must sign in again.
Logging out
POST /v1/auth/logout revokes the current refresh token and clears both cookies. It is
idempotent — safe to call when already logged out.
curl -b cookies.txt -c cookies.txt -X POST https://api.peridot.id/v1/auth/logoutSecurity notes
- Access tokens are short-lived; the real secret is the rotating refresh token.
- The refresh cookie's
Path=/v1/authmeans it is only sent to auth endpoints, reducing the window for cross-route exfiltration. - Auth endpoints are rate limited (see Errors).