diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 3b63209..151f4c9 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -26,6 +26,12 @@ export class UsersController { await this.usersService.discordLogin(session); } + @Get('/logout') + @Redirect(process.env.CLIENT_ENDPOINT) + async logout(@Session() session: Record): Promise { + await this.usersService.discordLogout(session); + } + @Get('/whoami') async remove(@Session() session: Record): Promise { if (!session.tokenData) { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index a07cb94..28d794e 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -81,6 +81,23 @@ export class UsersService { }; } + async revokeDiscordToken(refresh_token: string) { + const body = new URLSearchParams({ + client_id: process.env.DISCORD_CLIENTID, + client_secret: process.env.DISCORD_CLIENTSECRET, + token: refresh_token, + token_type_hint: 'refresh_token', + }); + + const req = await fetch('https://discord.com/api/oauth2/token/revoke', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body, + }); + } + async discordLogin( session: Record, recursive: boolean = false, @@ -126,7 +143,9 @@ export class UsersService { return user; } - remove(id: number) { - return `This action removes a #${id} user`; + async discordLogout(session: Record) { + this.revokeDiscordToken(session.tokenData.access_token); + delete session.user; + delete session.tokenData; } }