Skip to content

Instantly share code, notes, and snippets.

@landy
Created September 5, 2022 12:27
Show Gist options
  • Save landy/5e5bd3ecb464e6d0f6891abdac7e57e6 to your computer and use it in GitHub Desktop.
Save landy/5e5bd3ecb464e6d0f6891abdac7e57e6 to your computer and use it in GitHub Desktop.
[<RequireQualifiedAccess>]
module Household.Libraries.Jwt
open System
open System.IdentityModel.Tokens.Jwt
open System.Security.Cryptography
open Microsoft.IdentityModel.Tokens
[<Literal>]
let DefaultRefreshKeyLength = 32
let getKey (secret: string) =
SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(secret))
let createToken audience issuer secret expiration claims =
let credentials = SigningCredentials(getKey secret, SecurityAlgorithms.HmacSha256)
let issuedOn = DateTime.UtcNow
let expiresOn = issuedOn.Add(expiration)
let jwtToken =
JwtSecurityToken(issuer, audience, claims, (issuedOn |> Nullable), (expiresOn |> Nullable), credentials)
let handler = JwtSecurityTokenHandler()
handler.WriteToken(jwtToken), (expiresOn |> DateTimeOffset)
let createRefreshToken (size: int) expiration =
let randomNumber = Array.create size (Byte())
use generator = RandomNumberGenerator.Create()
let expiresOn = DateTimeOffset.UtcNow.Add(expiration)
generator.GetBytes(randomNumber)
Convert.ToBase64String(randomNumber), expiresOn
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment