feat: Support revoke refresh token to oidc logout function

Signed-off-by: mario ma <mario.ma.node@gmail.com>
This commit is contained in:
mario ma
2024-03-27 10:47:34 +08:00
parent 34783125fd
commit 28eb473fc3
3 changed files with 55 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend-module-oidc-provider': patch
---
Support revoke refresh token to oidc logout function
@@ -34,6 +34,7 @@ describe('oidcAuthenticator', () => {
let oauthState: OAuthState;
let idToken: string;
let publicKey: JWK;
const revokedTokenMap: Record<string, boolean> = {};
const mswServer = setupServer();
setupRequestMockHandlers(mswServer);
@@ -96,6 +97,13 @@ describe('oidcAuthenticator', () => {
res(ctx.status(200), ctx.json({ keys: [{ ...publicKey }] })),
),
rest.post('https://oidc.test/oauth2/token', async (req, res, ctx) => {
const formBody = new URLSearchParams(await req.text());
if (
formBody.get('grant_type') === 'refresh_token' &&
revokedTokenMap[formBody.get('refresh_token') as string]
) {
return res(ctx.json({}));
}
return res(
req.headers.get('Authorization')
? ctx.json({
@@ -123,6 +131,14 @@ describe('oidcAuthenticator', () => {
}),
),
),
rest.post(
'https://oidc.test/oauth2/revoke_token',
async (req, res, ctx) => {
const formBody = new URLSearchParams(await req.text());
revokedTokenMap[formBody.get('token') as string] = true;
return res(ctx.status(200));
},
),
);
implementation = oidcAuthenticator.initialize({
@@ -434,4 +450,30 @@ describe('oidcAuthenticator', () => {
expect(refreshResponse.session.idToken).toBe(idToken);
});
});
describe('#logout', () => {
it('should revoke refreshToken', async () => {
const refreshToken = 'revokeRefreshToken';
const refreshRequest = {
scope: '',
refreshToken,
req: {} as express.Request,
};
const logoutRequest = {
refreshToken,
req: {} as express.Request,
};
await oidcAuthenticator.logout?.(logoutRequest, implementation);
const refreshResponse = oidcAuthenticator.refresh(
refreshRequest,
implementation,
);
await expect(refreshResponse).rejects.toEqual(
new Error('Refresh failed'),
);
});
});
});
@@ -197,4 +197,12 @@ export const oidcAuthenticator = createOAuthAuthenticator({
});
});
},
async logout(input, ctx) {
const { client } = await ctx.promise;
if (input.refreshToken) {
await client.revoke(input.refreshToken);
}
},
});