Skip to main content

Sessions, user details & roles

Reading the current user in Fiber​

After Protect or Guard:

app.Get("/api/me", fiberauth.Protect(auth), func(c fiber.Ctx) error {
s := fiberauth.SessionFrom(c)
if s == nil || s.User == nil {
return fiber.NewError(fiber.StatusUnauthorized, "unauthorized")
}

return c.JSON(fiber.Map{
"user": fiber.Map{
"id": s.User.ID,
"email": s.User.Email,
"name": s.User.Name,
"image": s.User.Image,
},
"roles": s.Roles(),
"sessionId": s.StringClaim("sessionId"), // bearer flow
})
})

Session shape​

fiberauth.SessionFrom returns *goauth.Session:

Field / methodDescription
s.User*goauth.User — id, email, name, image
s.Roles()Roles from JWT roles array or role string
s.HasRole("admin")Case-sensitive role check
s.HasAnyRole("a", "b")Any role matches
s.Claim("plan")Arbitrary JWT claim
s.StringClaim("org")Claim as string

Adding roles in JWT callback​

Roles must be set when the token is created (credentials, OAuth, OTP sign-in):

auth, _ := goauth.New(goauth.Config{
Secret: []string{secret},
Providers: []goauth.Provider{ /* ... */ },
Callbacks: goauth.Callbacks{
JWT: func(ctx context.Context, p goauth.JWTCallbackParams) (goauth.JWT, error) {
if p.User != nil {
roles, _ := db.RolesForUser(ctx, p.User.ID)
p.Token["roles"] = roles
// optional single role for legacy checks:
if len(roles) > 0 {
p.Token["role"] = roles[0]
}
p.Token["plan"] = lookupPlan(p.User.ID)
}
return p.Token, nil
},
},
})

Then in Fiber:

app.Get("/api/billing",
fiberauth.Guard(auth,
fiberauth.HasRole("billing", "admin"),
fiberauth.HasClaim("plan", "pro"),
),
billingHandler,
)

Database session strategy​

With Adapter + StrategyDatabase, s.User is loaded from the adapter on each request. Roles still typically live in JWT claims if you use hybrid token+cookie, or add roles in Session callback:

Session: func(ctx context.Context, p goauth.SessionCallbackParams) (*goauth.Session, error) {
if p.Session != nil && p.User != nil {
// enrich before JSON response — not stored in JWT
}
return p.Session, nil
},

Note: Guard/HasRole read JWT claims on the session object — ensure roles are on the token or copied into claims goauth exposes.

GET /auth/session from Fiber​

Your SPA can also call goauth directly:

const res = await fetch("/auth/session", { credentials: "include" });
const session = await res.json();

Or with bearer:

const res = await fetch("/auth/session", {
headers: { Authorization: `Bearer ${accessToken}` },
});

Example from fiberauth repo​

The official example maps in-memory users to JWT roles:

JWT: func(_ context.Context, p goauth.JWTCallbackParams) (goauth.JWT, error) {
acc := findByID(p.User.ID)
if acc == nil {
acc = findByEmail(p.User.Email)
}
if acc != nil {
p.Token["roles"] = acc.Roles
}
return p.Token, nil
},
app.Get("/api/me", fiberauth.Protect(auth), func(c fiber.Ctx) error {
s := fiberauth.SessionFrom(c)
return c.JSON(fiber.Map{"user": s.User, "roles": s.Roles()})
})