uncrypto icon indicating copy to clipboard operation
uncrypto copied to clipboard

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

Open johannschopplich opened this issue 1 year ago โ€ข 1 comments

๐Ÿ”— Linked issue

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

#17

โ“ Type of change

  • [ ] ๐Ÿ“– Documentation (updates to the documentation, readme, or JSdoc annotations)
  • [ ] ๐Ÿž Bug fix (a non-breaking change that fixes an issue)
  • [ ] ๐Ÿ‘Œ Enhancement (improving an existing functionality like performance)
  • [x] โœจ New feature (a non-breaking change that adds functionality)
  • [ ] ๐Ÿงน Chore (updates to the build process or auxiliary tools and libraries)
  • [ ] โš ๏ธ Breaking change (fix or feature that would cause existing functionality to change)

๐Ÿ“š Description

Resolves #17.

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

  • signJWT
  • verifyJWT
  • decodeJWT

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: '[email protected]'
  },
  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

  • I had to rename crypto.web and crypto.node to crypto-web, respectively crypto-node, because unbuild v2 complained about the file extensions.
  • No tests added yet. I have used these utils for a while now in some Nuxt projects and published them as unjwt package โ€“ explicitly without uncrypto, since I rely on unenv to resolve the usage von the Web Crypto API.
  • In one project which used jose, I successfully migrated to these new utilities. No user got logged out. ๐Ÿ˜‹

Questions

  • atob and btoa are available in latest Node and worker versions, so I haven't added any usage of buffer. Is that OK for you?

๐Ÿ“ Checklist

  • [x] I have linked an issue or discussion.
  • [x] I have updated the documentation accordingly.

johannschopplich avatar Feb 20 '24 09:02 johannschopplich

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

johannschopplich avatar Feb 20 '24 09:02 johannschopplich