Skip to main content

Bearer tokens

Mobile apps and SPAs often need access and refresh tokens instead of cookies.

Enable

Tokens: goauth.TokensConfig{
Enabled: true,
AccessTokenMaxAge: 15 * time.Minute,
RefreshTokenMaxAge: 30 * 24 * time.Hour,
AlwaysReturn: false, // opt-in per request (default)
},

Opt in per request

Header / queryEffect
X-Auth-Flow: tokenReturn JSON tokens on sign-in
?flow=tokenSame

Sign-in response

{
"sessionId": "550e8400-e29b-41d4-a716-446655440000",
"user": {
"id": "1",
"name": "Demo",
"email": "demo@example.com"
},
"accessToken": "eyJ...",
"refreshToken": "eyJ...",
"tokenType": "Bearer",
"expiresIn": 900,
"expiresAt": 1780478790
}

sessionId is a UUID v4 — stable session identifier for client storage (e.g. localStorage key in goauth.js).

Authenticate API calls

curl https://app.example.com/api/me \
-H "Authorization: Bearer eyJ..."

auth.GetSession validates the access token automatically.

Refresh

curl -X POST https://app.example.com/auth/token \
-d "refresh_token=eyJ..."

Or JSON:

{ "refreshToken": "eyJ..." }

Returns a fresh access/refresh pair.

React Native (simple)

const res = await fetch(`${API}/auth/callback/credentials`, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"X-Auth-Flow": "token",
},
body: new URLSearchParams({ email, password }),
});
const tokens = await res.json();
await SecureStore.setItemAsync("accessToken", tokens.accessToken);

Advanced: AlwaysReturn

AlwaysReturn: true,

Every sign-in returns JSON — no redirects or session cookies. Useful for pure API gateways.