Skip to content

Commit 666c2b0

Browse files
committed
refactor: extract shared token finder for introspection and revocation
1 parent 2b7c025 commit 666c2b0

3 files changed

Lines changed: 58 additions & 95 deletions

File tree

lib/actions/introspection.js

Lines changed: 4 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import paramsMiddleware from '../shared/assemble_params.js';
88
import { InvalidRequest } from '../helpers/errors.js';
99
import rejectStructuredTokens from '../shared/reject_structured_tokens.js';
1010
import { checkAttestBinding } from '../helpers/check_attest_binding.js';
11+
import { createTokenFinder } from '../helpers/token_find.js';
1112

1213
const introspectable = new Set(['AccessToken', 'ClientCredentials', 'RefreshToken']);
1314
const JWT = 'application/token-introspection+jwt';
@@ -26,30 +27,10 @@ export default function introspectionAction(provider) {
2627
} = configuration;
2728
const { grantTypeHandlers } = instance(provider);
2829
const {
29-
IdToken, AccessToken, ClientCredentials, RefreshToken, Client,
30+
IdToken, Client,
3031
} = provider;
3132

32-
function getAccessToken(token) {
33-
return AccessToken.find(token);
34-
}
35-
36-
function getClientCredentials(token) {
37-
if (!grantTypeHandlers.has('client_credentials')) {
38-
return undefined;
39-
}
40-
return ClientCredentials.find(token);
41-
}
42-
43-
function getRefreshToken(token) {
44-
if (!grantTypeHandlers.has('refresh_token')) {
45-
return undefined;
46-
}
47-
return RefreshToken.find(token);
48-
}
49-
50-
function findResult(results) {
51-
return results.find((found) => !!found);
52-
}
33+
const findToken = createTokenFinder(provider, grantTypeHandlers);
5334

5435
return [
5536
noCache,
@@ -101,32 +82,7 @@ export default function introspectionAction(provider) {
10182

10283
ctx.body = { active: false };
10384

104-
let token;
105-
switch (params.token_type_hint) {
106-
case 'access_token':
107-
case 'urn:ietf:params:oauth:token-type:access_token':
108-
token = await Promise.all([
109-
getAccessToken(params.token),
110-
getClientCredentials(params.token),
111-
])
112-
.then(findResult)
113-
.then((result) => result || getRefreshToken(params.token));
114-
break;
115-
case 'refresh_token':
116-
case 'urn:ietf:params:oauth:token-type:refresh_token':
117-
token = await getRefreshToken(params.token)
118-
.then((result) => result || Promise.all([
119-
getAccessToken(params.token),
120-
getClientCredentials(params.token),
121-
]).then(findResult));
122-
break;
123-
default:
124-
token = await Promise.all([
125-
getAccessToken(params.token),
126-
getClientCredentials(params.token),
127-
getRefreshToken(params.token),
128-
]).then(findResult);
129-
}
85+
const token = await findToken(params.token, params.token_type_hint);
13086

13187
if (!token?.isValid) {
13288
return;

lib/actions/revocation.js

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import paramsMiddleware from '../shared/assemble_params.js';
77
import rejectStructuredTokens from '../shared/reject_structured_tokens.js';
88
import revoke from '../helpers/revoke.js';
99
import { checkAttestBinding } from '../helpers/check_attest_binding.js';
10+
import { createTokenFinder } from '../helpers/token_find.js';
1011

1112
const revokeable = new Set(['AccessToken', 'ClientCredentials', 'RefreshToken']);
1213

@@ -20,27 +21,7 @@ export default function revocationAction(provider) {
2021
},
2122
} = configuration;
2223

23-
function getAccessToken(token) {
24-
return provider.AccessToken.find(token);
25-
}
26-
27-
function getClientCredentials(token) {
28-
if (!grantTypeHandlers.has('client_credentials')) {
29-
return undefined;
30-
}
31-
return provider.ClientCredentials.find(token);
32-
}
33-
34-
function getRefreshToken(token) {
35-
if (!grantTypeHandlers.has('refresh_token')) {
36-
return undefined;
37-
}
38-
return provider.RefreshToken.find(token);
39-
}
40-
41-
function findResult(results) {
42-
return results.find((found) => !!found);
43-
}
24+
const findToken = createTokenFinder(provider, grantTypeHandlers);
4425

4526
return [
4627
parseBody,
@@ -64,32 +45,7 @@ export default function revocationAction(provider) {
6445
async function revokeToken(ctx) {
6546
const { params } = ctx.oidc;
6647

67-
let token;
68-
switch (params.token_type_hint) {
69-
case 'access_token':
70-
case 'urn:ietf:params:oauth:token-type:access_token':
71-
token = await Promise.all([
72-
getAccessToken(params.token),
73-
getClientCredentials(params.token),
74-
])
75-
.then(findResult)
76-
.then((result) => result || getRefreshToken(params.token));
77-
break;
78-
case 'refresh_token':
79-
case 'urn:ietf:params:oauth:token-type:refresh_token':
80-
token = await getRefreshToken(params.token)
81-
.then((result) => result || Promise.all([
82-
getAccessToken(params.token),
83-
getClientCredentials(params.token),
84-
]).then(findResult));
85-
break;
86-
default:
87-
token = await Promise.all([
88-
getAccessToken(params.token),
89-
getClientCredentials(params.token),
90-
getRefreshToken(params.token),
91-
]).then(findResult);
92-
}
48+
const token = await findToken(params.token, params.token_type_hint);
9349

9450
if (!token) return;
9551

lib/helpers/token_find.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
export function createTokenFinder(provider, grantTypeHandlers) {
2+
const { AccessToken, ClientCredentials, RefreshToken } = provider;
3+
4+
function getAccessToken(token) {
5+
return AccessToken.find(token);
6+
}
7+
8+
function getClientCredentials(token) {
9+
if (!grantTypeHandlers.has('client_credentials')) {
10+
return undefined;
11+
}
12+
return ClientCredentials.find(token);
13+
}
14+
15+
function getRefreshToken(token) {
16+
if (!grantTypeHandlers.has('refresh_token')) {
17+
return undefined;
18+
}
19+
return RefreshToken.find(token);
20+
}
21+
22+
function findResult(results) {
23+
return results.find((found) => !!found);
24+
}
25+
26+
return async function findTokenByHint(tokenValue, tokenTypeHint) {
27+
switch (tokenTypeHint) {
28+
case 'access_token':
29+
case 'urn:ietf:params:oauth:token-type:access_token':
30+
return Promise.all([
31+
getAccessToken(tokenValue),
32+
getClientCredentials(tokenValue),
33+
])
34+
.then(findResult)
35+
.then((result) => result || getRefreshToken(tokenValue));
36+
case 'refresh_token':
37+
case 'urn:ietf:params:oauth:token-type:refresh_token':
38+
return getRefreshToken(tokenValue)
39+
.then((result) => result || Promise.all([
40+
getAccessToken(tokenValue),
41+
getClientCredentials(tokenValue),
42+
]).then(findResult));
43+
default:
44+
return Promise.all([
45+
getAccessToken(tokenValue),
46+
getClientCredentials(tokenValue),
47+
getRefreshToken(tokenValue),
48+
]).then(findResult);
49+
}
50+
};
51+
}

0 commit comments

Comments
 (0)