0
0
mirror of https://github.com/honojs/hono.git synced 2024-12-01 11:51:01 +01:00
hono/deno_dist/middleware/jwt/index.ts

66 lines
1.9 KiB
TypeScript
Raw Normal View History

2022-07-02 08:09:45 +02:00
import type { Context } from '../../context.ts'
import type { Next } from '../../hono.ts'
import { Jwt } from '../../utils/jwt/index.ts'
import type { AlgorithmTypes } from '../../utils/jwt/types.ts'
export const jwt = (options: { secret: string; cookie?: string; alg?: string }) => {
2022-07-02 08:09:45 +02:00
if (!options) {
throw new Error('JWT auth middleware requires options for "secret')
}
2022-07-16 03:26:14 +02:00
if (!crypto.subtle || !crypto.subtle.importKey) {
throw new Error('`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.')
}
2022-07-02 08:09:45 +02:00
return async (ctx: Context, next: Next) => {
const credentials = ctx.req.headers.get('Authorization')
let token
if (credentials) {
const parts = credentials.split(/\s+/)
if (parts.length !== 2) {
ctx.res = new Response('Unauthorized', {
status: 401,
headers: {
'WWW-Authenticate': `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="invalid credentials structure"`,
},
})
return
} else {
token = parts[1]
}
} else if (options.cookie) {
token = ctx.req.cookie(options.cookie)
2022-07-02 08:09:45 +02:00
}
if (!token) {
2022-07-02 08:09:45 +02:00
ctx.res = new Response('Unauthorized', {
status: 401,
headers: {
'WWW-Authenticate': `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="no authorization included in request"`,
},
})
return
}
let authorized = false
let msg = ''
try {
authorized = await Jwt.verify(token, options.secret, options.alg as AlgorithmTypes)
2022-07-02 08:09:45 +02:00
} catch (e) {
msg = `${e}`
}
if (!authorized) {
ctx.res = new Response('Unauthorized', {
status: 401,
statusText: msg,
headers: {
'WWW-Authenticate': `Bearer realm="${ctx.req.url}",error="invalid_token",error_description="token verification failure"`,
},
})
return
}
await next()
}
}