Hi all
I'm experimenting with adding an authentication layer to my API. I use Wisp on the server and I have created the following middleware. It seems to work fine but looking on feedback to makes this as Gleamy as possible. Thx!
req: Request,
ctx: context.Context,
next: fn(Request) -> Response,
) -> Response {
{
let result = {
use auth_header <- result.try(
request.get_header(req, "authorization") |> result.replace_error(Nil),
)
use jwt <- result.try(case auth_header {
"Bearer " <> jwt -> Ok(jwt)
_ -> Error(Nil)
})
authentication.verify_jwt(
jwt,
ctx.auth_config.claims,
ctx.auth_config.verify_key,
)
|> result.replace_error(Nil)
}
case result {
Ok(_) -> next(req)
Error(_) -> wisp.response(401)
}
}
}
pub fn verify_jwt(
jwt: String,
claims: List(claim.Claim),
verify_key: verify_key.VerifyKey,
) -> Result(UserSession, ywt.ParseError) {
let payload_decoder = {
use user_id <- decode.field("sub", decode.string)
use org_id <- decode.field("org", decode.string)
decode.success(UserSession(user_id:, org_id:))
}
ywt.decode(jwt, using: payload_decoder, claims: claims, keys: [verify_key])
}```