unjs / uncrypto

Single API for Web Crypto API and Crypto Subtle working in Node.js, Browsers and other runtimes
MIT License
195 stars 8 forks source link

feat: `signJWT`, `verifyJWT` and `decodeJWT` utils #39

Open johannschopplich opened 9 months ago

johannschopplich commented 9 months ago

๐Ÿ”— Linked issue

[!NOTE] I accidentally closed the PR #23. This PR includes the same changes.

17

โ“ Type of change

๐Ÿ“š Description

Resolves #17.

The following JWT utilities will be available with this PR (migrated from unjwt):

I have kept the code as simple as possible to cover the basic needs for JWT signing, verification and decoding. Method parameters have a balance between sensible defaults and customization.

Example usage:

import { decodeJWT, signJWT, verifyJWT } from 'uncrypto/jwt'

interface JWTUserClaims {
  email: string
}

const secret = 'secret'
const issuer = 'https://domain.com'

// Sign a JWT
const accessToken = await signJWT<JWTUserClaims>({
  payload: {
    email: 'user@domain.com'
  },
  secret,
  issuer,
  audience: issuer,
})

// Verify a JWT
try {
  const verifiedAccessToken = await verifyJWT({
    token: accessToken,
    secret,
    issuer,
    audience: issuer
  })
}
catch (error) {
  // Handle error
  console.error(error)
}

// Decode a JWT โ€“ does not verify the signature
const decodedAccessToken = await decodeJWT<JWTUserClaims>(accessToken)
console.log(decodedAccessToken.email)

Please verify if the general direction of this PR makes sense to you. If you, I'm willing to add tests as best as I can.

Notes

Questions

๐Ÿ“ Checklist

johannschopplich commented 9 months ago

@pi0 Here it is, again! Feel free to rename methods, move methods around โ€“ I'm happy to learn from your methodology.