(resolveConfig: Effect.Effect<ResolvedConfig, InvalidRequestError | InvalidTokenError>)
| 200 | |
| 201 | const verifyToken = |
| 202 | (resolveConfig: Effect.Effect<ResolvedConfig, InvalidRequestError | InvalidTokenError>) => (token: string) => |
| 203 | resolveConfig.pipe( |
| 204 | Effect.flatMap((config) => { |
| 205 | const options = { |
| 206 | clockTolerance: config.clockTolerance, |
| 207 | ...(config.tokenSigningAlg ? { algorithms: [config.tokenSigningAlg] } : {}), |
| 208 | ...(config.audience !== undefined ? { audience: config.audience } : {}), |
| 209 | ...(config.issuer !== undefined ? { issuer: config.issuer } : {}), |
| 210 | ...(config.maxTokenAge !== undefined ? { maxTokenAge: config.maxTokenAge } : {}) |
| 211 | } |
| 212 | const verified = config.keyType === "jwks" |
| 213 | ? Effect.tryPromise({ |
| 214 | try: () => jwtVerify(token, config.key, options).then(({ protectedHeader }) => ({ protectedHeader })), |
| 215 | catch: (error) => new InvalidTokenError(getErrorMessage(error)) |
| 216 | }) |
| 217 | : Effect.tryPromise({ |
| 218 | try: () => jwtVerify(token, config.key, options).then(({ protectedHeader }) => ({ protectedHeader })), |
| 219 | catch: (error) => new InvalidTokenError(getErrorMessage(error)) |
| 220 | }) |
| 221 | |
| 222 | return verified.pipe( |
| 223 | Effect.flatMap(({ protectedHeader }) => { |
| 224 | const typ = protectedHeader.typ?.toLowerCase().replace(/^application\//, "") |
| 225 | return config.strict && typ !== "at+jwt" |
| 226 | ? Effect.fail(new InvalidTokenError("Unexpected 'typ' value")) |
| 227 | : Effect.void |
| 228 | }) |
| 229 | ) |
| 230 | }) |
| 231 | ) |
| 232 | |
| 233 | export const checkJWTI = (config: Config) => { |
| 234 | const resolveConfig = makeResolveConfig(config) |
no test coverage detected
searching dependent graphs…