65 lines
1.7 KiB
Gleam
65 lines
1.7 KiB
Gleam
import gleam/dynamic/decode.{type Decoder}
|
|
import gleam/http/request.{type Request}
|
|
import gleam/result
|
|
import utils/jwt
|
|
|
|
pub opaque type AccountToken {
|
|
AccountToken(token: String)
|
|
}
|
|
|
|
pub opaque type AgentToken {
|
|
AgentToken(token: String)
|
|
}
|
|
|
|
pub type TokenParseError {
|
|
InvalidToken
|
|
IncorrectType
|
|
}
|
|
|
|
pub fn parse_account_token(
|
|
value: String,
|
|
) -> Result(AccountToken, TokenParseError) {
|
|
use jwt <- result.try(jwt.parse(value) |> result.replace_error(InvalidToken))
|
|
case jwt.payload.subject {
|
|
"account-token" -> Ok(AccountToken(value))
|
|
_ -> Error(IncorrectType)
|
|
}
|
|
}
|
|
|
|
pub fn account_token_decoder() -> Decoder(AccountToken) {
|
|
use value <- decode.then(decode.string)
|
|
case parse_account_token(value) {
|
|
Ok(token) -> decode.success(token)
|
|
Error(_) -> decode.failure(AccountToken("invalid"), "AccountToken")
|
|
}
|
|
}
|
|
|
|
pub fn parse_agent_token(value: String) -> Result(AgentToken, TokenParseError) {
|
|
use jwt <- result.try(jwt.parse(value) |> result.replace_error(InvalidToken))
|
|
case jwt.payload.subject {
|
|
"agent-token" -> Ok(AgentToken(value))
|
|
_ -> Error(IncorrectType)
|
|
}
|
|
}
|
|
|
|
pub fn agent_token_decoder() -> Decoder(AgentToken) {
|
|
use value <- decode.then(decode.string)
|
|
case parse_agent_token(value) {
|
|
Ok(token) -> decode.success(token)
|
|
Error(_) -> decode.failure(AgentToken("invalid"), "AgentToken")
|
|
}
|
|
}
|
|
|
|
pub type AuthMethod {
|
|
AccountAuth(AccountToken)
|
|
AgentAuth(AgentToken)
|
|
NoAuth
|
|
}
|
|
|
|
pub fn set_auth(req: Request(a), auth_method: AuthMethod) -> Request(a) {
|
|
case auth_method {
|
|
NoAuth -> req
|
|
AccountAuth(AccountToken(token)) | AgentAuth(AgentToken(token)) ->
|
|
req |> request.set_header("Authorization", "Bearer " <> token)
|
|
}
|
|
}
|