Skip to content
Back to skills

Gotrue

ASecurity

GoTrue auth — user management, JWT, refresh tokens, custom claims.

  • 6 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 5, 2026
developmentrustgodockergitapidatabase

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 5, 2026

npx -y skills add Dev-Toolbelt/dev-team-agents --skill gotrue --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Gotrue?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Gotrue
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dev-toolbelt-gotrue/badge)](https://www.skillsdirectory.com/skills/dev-toolbelt-gotrue)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: gotrue
description: GoTrue auth — user management, JWT, refresh tokens, custom claims.
---

# GoTrue

GoTrue is a stateless authentication microservice. It issues JWTs, manages user sessions, and handles OAuth flows. Supabase embeds it as the `auth` service; it can also run standalone.

---

## Detection Signals

Load this skill when any of the following are present:

| Signal | Location |
|---|---|
| `GOTRUE_*` env vars | `.env`, `.env.example`, deploy config |
| `SUPABASE_JWT_SECRET`, `SUPABASE_SERVICE_ROLE_KEY` | `.env`, `.env.example` |
| `@supabase/supabase-js`, `@supabase/auth-js`, `@supabase/ssr` | `package.json` |
| `supabase.auth.*` calls | application source |
| `[auth]` or `[auth.hook.*]` section | `supabase/config.toml` |
| `auth.users` table or `auth` schema | database schema / migrations |
| `supabase/auth` or `gotrue` image | `docker-compose.yml` |

---

## Auth Methods

| Method | API call (supabase-js) |
|---|---|
| Email + password | `supabase.auth.signInWithPassword({ email, password })` |
| Magic link | `supabase.auth.signInWithOtp({ email })` |
| Phone OTP | `supabase.auth.signInWithOtp({ phone })` |
| OAuth (Google, GitHub, etc.) | `supabase.auth.signInWithOAuth({ provider: 'google' })` |
| Anonymous | `supabase.auth.signInAnonymously()` |
| SSO / SAML | `supabase.auth.signInWithSSO({ domain })` |

---

## Core Rules

These decide the shape of the work. Code-level detail lives in the references below.

| Area | Rule |
|---|---|
| Authorization source | Read roles and permissions from `app_metadata` only — it is server-controlled |
| `user_metadata` | User-writable. Never an authorization input, under any circumstance |
| Server-side trust | `getSession()` does not verify — always follow with `getUser()` before trusting an identity on the server |
| Service-role key | Server-side only. Reaching it from client code grants full auth admin access |
| Token lifetime | Access tokens are short-lived (1h default); the client must handle refresh via `onAuthStateChange` |
| Claim changes | Custom claims are frozen into an issued JWT — a role change only applies after a token refresh |
| Environment parity | Confirm email-confirmation and expiry settings match between environments; GoTrue defaults differ |

---

## References

| File | Load when |
|---|---|
| `references/client-and-admin-api.md` | Implementing sign-in, sessions, refresh, the Admin API, or server-side JWT verification |
| `references/claims-and-hooks.md` | Adding custom claims, writing RLS against them, or configuring GoTrue hooks |

---

## Common Pitfalls

- Reading `user_metadata` for authorization — users control it, never trust it for permissions
- Not calling `onAuthStateChange` on the client — sessions expire silently
- Using `getSession()` on the server without re-verification — the session in the cookie may be stale; always call `getUser()` to verify server-side
- Exposing the service-role key in client code — gives full auth admin access
- Not enabling email confirmations in production — GoTrue defaults may differ between environments
- Assuming a revoked role takes effect immediately — the old JWT stays valid until it expires or is refreshed

Files in this skill

  • SKILL.md3.1 KB
  • references/claims-and-hooks.md2 KB
  • references/client-and-admin-api.md3.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.