Skip to content

Commit 9b89153

Browse files
committed
fix: ensure an account's accountId and claims().sub is the same
closes #1336
1 parent 5ab1429 commit 9b89153

File tree

7 files changed

+19
-7
lines changed

7 files changed

+19
-7
lines changed

lib/actions/grants/authorization_code.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import dpopValidate, { DPOP_OK_WINDOW } from '../../helpers/validate_dpop.js';
88
import resolveResource from '../../helpers/resolve_resource.js';
99
import epochTime from '../../helpers/epoch_time.js';
1010
import checkRar from '../../shared/check_rar.js';
11+
import getCtxAccountClaims from '../../helpers/account_claims.js';
1112

1213
const gty = 'authorization_code';
1314

@@ -210,7 +211,7 @@ export const handler = async function authorizationCodeHandler(ctx) {
210211
const claims = filterClaims(code.claims, 'id_token', grant);
211212
const rejected = grant.getRejectedOIDCClaims();
212213
const token = new IdToken({
213-
...await account.claims('id_token', code.scope, claims, rejected),
214+
...await getCtxAccountClaims(ctx, 'id_token', code.scope, claims, rejected),
214215
acr: code.acr,
215216
amr: code.amr,
216217
auth_time: code.authTime,

lib/actions/grants/ciba.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import revoke from '../../helpers/revoke.js';
88
import dpopValidate, { DPOP_OK_WINDOW } from '../../helpers/validate_dpop.js';
99
import resolveResource from '../../helpers/resolve_resource.js';
1010
import epochTime from '../../helpers/epoch_time.js';
11+
import getCtxAccountClaims from '../../helpers/account_claims.js';
1112

1213
const {
1314
AuthorizationPending,
@@ -203,7 +204,7 @@ export const handler = async function cibaHandler(ctx) {
203204
const claims = filterClaims(request.claims, 'id_token', grant);
204205
const rejected = grant.getRejectedOIDCClaims();
205206
const token = new IdToken({
206-
...await account.claims('id_token', request.scope, claims, rejected),
207+
...await getCtxAccountClaims(ctx, 'id_token', request.scope, claims, rejected),
207208
...{
208209
acr: request.acr,
209210
amr: request.amr,

lib/actions/grants/device_code.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import revoke from '../../helpers/revoke.js';
88
import dpopValidate, { DPOP_OK_WINDOW } from '../../helpers/validate_dpop.js';
99
import resolveResource from '../../helpers/resolve_resource.js';
1010
import epochTime from '../../helpers/epoch_time.js';
11+
import getCtxAccountClaims from '../../helpers/account_claims.js';
1112

1213
const {
1314
AuthorizationPending,
@@ -202,7 +203,7 @@ export const handler = async function deviceCodeHandler(ctx) {
202203
const claims = filterClaims(code.claims, 'id_token', grant);
203204
const rejected = grant.getRejectedOIDCClaims();
204205
const token = new IdToken({
205-
...await account.claims('id_token', code.scope, claims, rejected),
206+
...await getCtxAccountClaims(ctx, 'id_token', code.scope, claims, rejected),
206207
...{
207208
acr: code.acr,
208209
amr: code.amr,

lib/actions/grants/refresh_token.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import dpopValidate, { DPOP_OK_WINDOW } from '../../helpers/validate_dpop.js';
1010
import resolveResource from '../../helpers/resolve_resource.js';
1111
import epochTime from '../../helpers/epoch_time.js';
1212
import checkRar from '../../shared/check_rar.js';
13+
import getCtxAccountClaims from '../../helpers/account_claims.js';
1314

1415
import { gty as cibaGty } from './ciba.js';
1516
import { gty as deviceCodeGty } from './device_code.js';
@@ -233,7 +234,7 @@ export const handler = async function refreshTokenHandler(ctx) {
233234
const claims = filterClaims(refreshToken.claims, 'id_token', grant);
234235
const rejected = grant.getRejectedOIDCClaims();
235236
const token = new IdToken(({
236-
...await account.claims('id_token', [...scope].join(' '), claims, rejected),
237+
...await getCtxAccountClaims(ctx, 'id_token', [...scope].join(' '), claims, rejected),
237238
acr: refreshToken.acr,
238239
amr: refreshToken.amr,
239240
auth_time: refreshToken.authTime,

lib/actions/userinfo.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import epochTime from '../helpers/epoch_time.js';
1212
import {
1313
InvalidToken, InsufficientScope, InvalidDpopProof, UseDpopNonce,
1414
} from '../helpers/errors.js';
15+
import getCtxAccountClaims from '../helpers/account_claims.js';
1516

1617
const PARAM_LIST = new Set([
1718
'scope',
@@ -200,7 +201,7 @@ export default [
200201

201202
if (client.userinfoSignedResponseAlg || client.userinfoEncryptedResponseAlg) {
202203
const token = new ctx.oidc.provider.IdToken(
203-
await ctx.oidc.account.claims('userinfo', scope, claims, rejected),
204+
await getCtxAccountClaims(ctx, 'userinfo', scope, claims, rejected),
204205
{ ctx },
205206
);
206207

@@ -215,7 +216,7 @@ export default [
215216
ctx.type = 'application/jwt; charset=utf-8';
216217
} else {
217218
const mask = new ctx.oidc.provider.Claims(
218-
await ctx.oidc.account.claims('userinfo', scope, claims, rejected),
219+
await getCtxAccountClaims(ctx, 'userinfo', scope, claims, rejected),
219220
{ ctx },
220221
);
221222

lib/helpers/account_claims.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export default async function getCtxAccountClaims(ctx, use, scope, claims, rejected) {
2+
return {
3+
...await ctx.oidc.account.claims(use, scope, claims, rejected),
4+
sub: ctx.oidc.account.accountId,
5+
};
6+
}

lib/helpers/process_response_types.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { InvalidTarget } from './errors.js';
22
import instance from './weak_cache.js';
33
import filterClaims from './filter_claims.js';
44
import combinedScope from './combined_scope.js';
5+
import getCtxAccountClaims from './account_claims.js';
56

67
async function tokenHandler(ctx) {
78
const { accountId } = ctx.oidc.session;
@@ -130,7 +131,7 @@ async function idTokenHandler(ctx) {
130131
const rejected = ctx.oidc.grant.getRejectedOIDCClaims();
131132
const scope = ctx.oidc.grant.getOIDCScopeFiltered(ctx.oidc.requestParamScopes);
132133
const idToken = new ctx.oidc.provider.IdToken({
133-
...await ctx.oidc.account.claims('id_token', scope, claims, rejected),
134+
...await getCtxAccountClaims(ctx, 'id_token', scope, claims, rejected),
134135
acr: ctx.oidc.acr,
135136
amr: ctx.oidc.amr,
136137
auth_time: ctx.oidc.session.authTime(),

0 commit comments

Comments
 (0)