thiskevinwang/coffee-code-climb

View on GitHub
src/utils/Playground/jwt.ts

Summary

Maintainability
A
1 hr
Test Coverage
import jwksClient, { JwksClient } from "jwks-rsa"
import jwt, { JwtHeader } from "jsonwebtoken"
import { promisify } from "util"

const client: JwksClient = jwksClient({
  jwksUri: process.env.GATSBY_JWKS_URI as string,
})

/**
 * A promisified version of `getKey` from the jsonwebtoken docs
 *
 * For `getKey`
 * - @see https://www.npmjs.com/package/jsonwebtoken
 *
 * For async version,
 * - @see https://github.com/auth0/node-jsonwebtoken/issues/111#issuecomment-592611392
 */
const getKeyAsync = async (header?: JwtHeader) => {
  const getPubKey = promisify(client.getSigningKey)
  const key = await getPubKey(header?.kid as string)
  const pubKey = key.getPublicKey()
  return pubKey
}

export const verifyTokenAsync = async (token: string) => {
  try {
    const tokenHeader: JwtHeader = (jwt.decode(token, {
      complete: true,
    }) as any)?.header
    const pubKey = await getKeyAsync(tokenHeader)
    const decoded = jwt.verify(token, pubKey)
    return decoded
  } catch (err) {
    return err
  }
}