mirror of
https://github.com/hanzoai/openid-client.git
synced 2026-09-24 17:01:10 +00:00
79 lines
2.0 KiB
TypeScript
79 lines
2.0 KiB
TypeScript
import test from 'ava'
|
|
import * as client from '../src/index.js'
|
|
import * as jose from 'jose'
|
|
|
|
test('RSA-OAEP JWE decryption ignores unrelated keys without kid', async (t) => {
|
|
const issuer = new URL('https://as.example.com')
|
|
const signingKeyPair = await client.randomDPoPKeyPair('ES256')
|
|
const rsaKeyPair = await crypto.subtle.generateKey(
|
|
{
|
|
name: 'RSA-OAEP',
|
|
modulusLength: 2048,
|
|
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
|
hash: 'SHA-1',
|
|
},
|
|
false,
|
|
['encrypt', 'decrypt'],
|
|
)
|
|
const ecdhKeyPair = await crypto.subtle.generateKey(
|
|
{ name: 'ECDH', namedCurve: 'P-256' },
|
|
false,
|
|
['deriveBits'],
|
|
)
|
|
|
|
const idToken = await new jose.SignJWT()
|
|
.setProtectedHeader({ alg: 'ES256' })
|
|
.setIssuer(issuer.href)
|
|
.setAudience('test-client-id')
|
|
.setSubject('subject')
|
|
.setIssuedAt()
|
|
.setExpirationTime('1m')
|
|
.sign(signingKeyPair.privateKey)
|
|
|
|
const encryptedIdToken = await new jose.CompactEncrypt(
|
|
new TextEncoder().encode(idToken),
|
|
)
|
|
.setProtectedHeader({ alg: 'RSA-OAEP', enc: 'A256GCM' })
|
|
.encrypt(rsaKeyPair.publicKey)
|
|
|
|
const config = new client.Configuration(
|
|
{
|
|
issuer: issuer.href,
|
|
token_endpoint: `${issuer.origin}/token`,
|
|
id_token_signing_alg_values_supported: ['ES256'],
|
|
},
|
|
'test-client-id',
|
|
undefined,
|
|
client.None(),
|
|
)
|
|
|
|
client.enableDecryptingResponses(
|
|
config,
|
|
undefined,
|
|
ecdhKeyPair.privateKey,
|
|
rsaKeyPair.privateKey,
|
|
)
|
|
config[client.customFetch] = async () => {
|
|
return new Response(
|
|
JSON.stringify({
|
|
access_token: 'test-access-token',
|
|
token_type: 'bearer',
|
|
id_token: encryptedIdToken,
|
|
}),
|
|
{
|
|
headers: {
|
|
'content-type': 'application/json',
|
|
},
|
|
},
|
|
)
|
|
}
|
|
|
|
const result = await client.authorizationCodeGrant(
|
|
config,
|
|
new URL('https://rp.example.com/cb?code=code'),
|
|
{ idTokenExpected: true },
|
|
)
|
|
|
|
t.is(result.claims()?.sub, 'subject')
|
|
})
|