import gleam/dynamic/decode import gleam/io import gleam/json import gleam/string import gleam/time/duration import ywt import ywt/algorithm import ywt/claim import ywt/verify_key pub fn main() -> Nil { // Generate a new, random signing key let signing_key = ywt.generate_key(algorithm.es384) // Create user payload data let payload = [ #("sub", json.string("user123")), #("role", json.string("admin")), ] // Define security claims let claims = [ claim.expires_at(max_age: duration.hours(1), leeway: duration.minutes(5)), claim.issuer("https://auth.myapp.com", []), claim.audience("https://api.myapp.com", []), ] // Create and sign the JWT let jwt = ywt.encode(payload, claims, signing_key) io.println("Signed JWT: " <> jwt) // Extract verification key (for distribution to other services) let verify_key = verify_key.derived(signing_key) io.println( "Public verification key: " <> json.to_string(verify_key.to_jwk(verify_key)), ) // Verify the JWT let decoder = { use id <- decode.field("sub", decode.string) use role <- decode.field("role", decode.string) decode.success(#(id, role)) } let result = ywt.decode(jwt, using: decoder, claims:, keys: [verify_key]) case result { Ok(#(id, role)) -> { io.println("JWT verified successfully!") io.println("User id: " <> id) io.println("User role: " <> role) } Error(ywt.TokenExpired(_expired_at)) -> { io.println("Token expired!") } Error(ywt.InvalidSignature) -> { io.println("Invalid signature - token may be forged") } Error(error) -> { io.println("JWT verification failed: " <> string.inspect(error)) } } }