Skip to content

Auth Examples

Examples

This guide provides practical examples of using the Authentication service.

Using cURL

Generating a User Token

Terminal window
curl -X POST https://auth.genstack.app/token \
-H "Content-Type: application/json" \
-d '{
"userId": "YOUR_USER_ID",
"clerkToken": "YOUR_CLERK_TOKEN",
"lifetimeSeconds": 3600
}'

Validating a Token

Terminal window
curl -X POST https://auth.genstack.app/validate \
-H "Content-Type: application/json" \
-d '{
"genstackToken": "YOUR_GENSTACK_TOKEN"
}'

Logging Out

Terminal window
curl -X POST https://auth.genstack.app/logout \
-H "Content-Type: application/json" \
-d '{
"genstackToken": "YOUR_GENSTACK_TOKEN",
"clerkToken": "YOUR_CLERK_TOKEN"
}'

Using TypeScript/JavaScript

Complete Authentication Flow

interface AuthResponse {
genstackToken: string;
}
interface ValidationResponse {
valid: boolean;
userId: string;
isMarketing: boolean;
expiresAt: string;
}
class AuthClient {
private baseUrl: string;
constructor(baseUrl: string) {
this.baseUrl = baseUrl;
}
async getToken(userId: string, clerkToken: string, lifetimeSeconds: number): Promise<string> {
const response = await fetch(`${this.baseUrl}/token`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
userId,
clerkToken,
lifetimeSeconds,
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
const data: AuthResponse = await response.json();
return data.genstackToken;
}
async validateToken(token: string): Promise<ValidationResponse> {
const response = await fetch(`${this.baseUrl}/validate`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
genstackToken: token,
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
return response.json();
}
async logout(genstackToken: string, clerkToken?: string): Promise<void> {
const response = await fetch(`${this.baseUrl}/logout`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
genstackToken,
clerkToken,
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
}
}
// Usage Example
async function authenticationFlow() {
const authClient = new AuthClient("https://auth.genstack.app");
try {
// Get token
const token = await authClient.getToken("YOUR_USER_ID", "YOUR_CLERK_TOKEN", 3600);
console.log("Token received:", token);
// Validate token
const validation = await authClient.validateToken(token);
console.log("Token validation:", validation);
// Use token in application...
// Logout when done
await authClient.logout(token, "YOUR_CLERK_TOKEN");
console.log("Logged out successfully");
} catch (error) {
console.error("Authentication error:", error);
}
}

Error Handling Examples

Token Validation Errors

async function handleTokenValidation(token: string) {
try {
const response = await fetch("https://auth.genstack.app/validate", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
genstackToken: token,
}),
});
if (!response.ok) {
const error = await response.json();
switch (error.error.type) {
case "InvalidCredentials":
console.error("Token is invalid");
// Redirect to login
break;
case "SessionExpired":
console.error("Token has expired");
// Refresh token or redirect to login
break;
default:
console.error("Unexpected error:", error.error.message);
}
return;
}
const validation = await response.json();
// Process validated token...
} catch (error) {
console.error("Validation request failed:", error);
}
}