Skip to content

Commit faee2c4

Browse files
committed
fix(auth0-server-js): treat session with no stored domain as mismatch in resolver mode
1 parent 1f96177 commit faee2c4

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

packages/auth0-server-js/src/server-client.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7003,6 +7003,39 @@ describe('revokeRefreshToken', () => {
70037003
await expect(serverClient.revokeRefreshToken()).resolves.toBeUndefined();
70047004
expect(revokeCalled).toBe(false);
70057005
});
7006+
7007+
test('should skip revocation in resolver mode when session has no stored domain', async () => {
7008+
const domainResolver = vi.fn().mockResolvedValue('resolver.local');
7009+
let revokeCalled = false;
7010+
7011+
server.use(
7012+
http.post('https://resolver.local/oauth/revoke', () => {
7013+
revokeCalled = true;
7014+
return new HttpResponse(null, { status: 200 });
7015+
})
7016+
);
7017+
7018+
const stateData: StateData = {
7019+
user: { sub: '<sub>' },
7020+
idToken: '<id_token>',
7021+
refreshToken: '<refresh_token>',
7022+
tokenSets: [],
7023+
// no domain field
7024+
internal: { sid: '<sid>', createdAt: Date.now() },
7025+
};
7026+
7027+
const serverClient = new ServerClient({
7028+
domain: domainResolver,
7029+
clientId: '<client_id>',
7030+
clientSecret: '<client_secret>',
7031+
discoveryCache: { ttl: 0 },
7032+
transactionStore: { get: vi.fn(), set: vi.fn(), delete: vi.fn() },
7033+
stateStore: { get: vi.fn().mockResolvedValue(stateData), set: vi.fn(), delete: vi.fn(), deleteByLogoutToken: vi.fn() },
7034+
});
7035+
7036+
await expect(serverClient.revokeRefreshToken()).resolves.toBeUndefined();
7037+
expect(revokeCalled).toBe(false);
7038+
});
70067039
});
70077040

70087041
describe('logout revocation', () => {

packages/auth0-server-js/src/server-client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,8 +1113,8 @@ export class ServerClient<TStoreOptions = unknown> {
11131113
if (this.#isResolverMode()) {
11141114
const resolvedDomain = await this.#resolveDomain(storeOptions);
11151115
const sessionDomain = stateData ? this.#getSessionDomain(stateData) : undefined;
1116-
if (sessionDomain && sessionDomain !== resolvedDomain) {
1117-
// Session belongs to a different tenant; do not revoke against the wrong domain.
1116+
if (stateData && sessionDomain !== resolvedDomain) {
1117+
// Session exists but its domain is unknown or belongs to a different tenant; do not revoke.
11181118
return;
11191119
}
11201120
authClient = this.#getAuthClient(sessionDomain ?? resolvedDomain);

0 commit comments

Comments
 (0)