feat(cloudflare-access): Add support to read JWT from Cookie (#1001)
parent
5ea7fb5d09
commit
69c3983d20
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@hono/cloudflare-access': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Add support to read JWT from Cookie
|
|
@ -229,6 +229,22 @@ describe('Cloudflare Access middleware', async () => {
|
||||||
expect(await res.text()).toBe('foo')
|
expect(await res.text()).toBe('foo')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('Should work when sending jwt as a Cookie', async () => {
|
||||||
|
const token = generateJWT(keyPair1.privateKey, {
|
||||||
|
sub: '1234567890',
|
||||||
|
iss: 'https://my-cool-team-name.cloudflareaccess.com',
|
||||||
|
})
|
||||||
|
|
||||||
|
const res = await app.request('http://localhost/hello-behind-access', {
|
||||||
|
headers: {
|
||||||
|
Cookie: `CF_Authorization=${token}`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
expect(res).not.toBeNull()
|
||||||
|
expect(res.status).toBe(200)
|
||||||
|
expect(await res.text()).toBe('foo')
|
||||||
|
})
|
||||||
|
|
||||||
it('Should work with tokens signed by the 2º key in the public keys list', async () => {
|
it('Should work with tokens signed by the 2º key in the public keys list', async () => {
|
||||||
const token = generateJWT(keyPair2.privateKey, {
|
const token = generateJWT(keyPair2.privateKey, {
|
||||||
sub: '1234567890',
|
sub: '1234567890',
|
||||||
|
@ -279,7 +295,7 @@ describe('Cloudflare Access middleware', async () => {
|
||||||
expect(res).not.toBeNull()
|
expect(res).not.toBeNull()
|
||||||
expect(res.status).toBe(500)
|
expect(res.status).toBe(500)
|
||||||
expect(await res.json()).toEqual({
|
expect(await res.json()).toEqual({
|
||||||
err: 'Error: Authentication error: The Access Organization \'my-cool-team-name\' does not exist',
|
err: "Error: Authentication error: The Access Organization 'my-cool-team-name' does not exist",
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import type { Context } from 'hono'
|
import type { Context } from 'hono'
|
||||||
|
import { getCookie } from 'hono/cookie';
|
||||||
import { createMiddleware } from 'hono/factory'
|
import { createMiddleware } from 'hono/factory'
|
||||||
import { HTTPException } from 'hono/http-exception'
|
import { HTTPException } from 'hono/http-exception'
|
||||||
|
|
||||||
|
@ -133,11 +134,11 @@ async function getPublicKeys(accessTeamName: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getJwt(c: Context) {
|
function getJwt(c: Context) {
|
||||||
const authHeader = c.req.header('cf-access-jwt-assertion')
|
const jwt = c.req.header('cf-access-jwt-assertion') ?? getCookie(c, 'CF_Authorization')
|
||||||
if (!authHeader) {
|
if (!jwt) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return authHeader.trim()
|
return jwt.trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
function decodeJwt(token: string): DecodedToken {
|
function decodeJwt(token: string): DecodedToken {
|
||||||
|
|
Loading…
Reference in New Issue