Skip to content

Commit a673bc5

Browse files
author
hersveit
authored
Merge pull request #15 from fullstack-development/sign-out
SignOut
2 parents 52255ea + 73e847b commit a673bc5

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

src/services/auth/__tests__/auth.service.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,4 +372,29 @@ describe('AuthService', () => {
372372
expect(confirmResult).toBeInstanceOf(CannotFindEmailConfirm);
373373
});
374374
});
375+
376+
describe('signOut', () => {
377+
it('should delete refresh token from database on signOut', async () => {
378+
userService.findUser.mockResolvedValueOnce(user);
379+
380+
await authService.signOut(user.email);
381+
382+
expect(userService.findUser).toBeCalledTimes(1);
383+
expect(userService.findUser).toBeCalledWith({ email: user.email });
384+
expect(refreshTokensRepository.Dao.delete).toBeCalledTimes(1);
385+
expect(refreshTokensRepository.Dao.delete).toBeCalledWith({
386+
where: { userId: user.id },
387+
});
388+
});
389+
390+
it('should not call delete on error when findUser function is called', async () => {
391+
userService.findUser.mockResolvedValueOnce(new CannotFindUser());
392+
393+
await authService.signOut(user.email);
394+
395+
expect(userService.findUser).toBeCalledTimes(1);
396+
expect(userService.findUser).toBeCalledWith({ email: user.email });
397+
expect(refreshTokensRepository.Dao.delete).toBeCalledTimes(0);
398+
});
399+
});
375400
});

src/services/auth/auth.service.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ export class AuthServiceProvider {
6464
return this.generateTokensWithCookie(userResult.id, userResult.email);
6565
}
6666

67+
async signOut(email: string) {
68+
const user = await this.userService.findUser({ email });
69+
if (!isError(user)) {
70+
await this.refreshTokens.Dao.delete({ where: { userId: user.id } });
71+
}
72+
}
73+
6774
async confirmEmail(confirmUuid: string) {
6875
const confirmEntityResult = await this.emailConfirms.Dao.findFirst({
6976
where: { confirmUuid },
@@ -115,7 +122,7 @@ export class AuthServiceProvider {
115122

116123
async generateTokens(id: number, email: string) {
117124
const refreshToken = this.jwtService.sign(
118-
{ email },
125+
{ email, date: Date.now() },
119126
{
120127
expiresIn: this.configService.JWT_REFRESH_TOKEN_EXPIRATION_TIME,
121128
secret: this.configService.JWT_REFRESH_TOKEN_SECRET,
@@ -146,7 +153,7 @@ export class AuthServiceProvider {
146153
}
147154

148155
return {
149-
accessToken: this.jwtService.sign({ email }),
156+
accessToken: this.jwtService.sign({ email, date: Date.now() }),
150157
refreshToken,
151158
};
152159
}
@@ -160,8 +167,9 @@ export class AuthServiceProvider {
160167

161168
return {
162169
accessToken: tokens.accessToken,
163-
// eslint-disable-next-line max-len
164-
refreshCookie: `Refresh=${tokens.refreshToken}; HttpOnly; Path=/; Max-Age=${this.configService.JWT_REFRESH_TOKEN_EXPIRATION_TIME}`,
170+
refreshCookie:
171+
`Refresh=${tokens.refreshToken}; HttpOnly; ` +
172+
`Path=/; Max-Age=${this.configService.JWT_REFRESH_TOKEN_EXPIRATION_TIME}`,
165173
};
166174
}
167175
}

src/services/auth/strategies/jwt-refresh.strategy.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ export class JwtRefreshTokenStrategy extends PassportStrategy(Strategy, 'jwt-ref
3131
});
3232

3333
const refreshToken = user?.refreshToken?.hash;
34-
3534
const token: string | undefined = request.cookies?.Refresh;
3635

3736
if (user && refreshToken && token && sha256(token) === refreshToken) {

0 commit comments

Comments
 (0)