feat(auth): harden authentication with argon2 passwords and rotating hashed refresh tokens
This commit is contained in:
@@ -25,10 +25,41 @@ export class JwtManager {
|
||||
new plugins.typedrequest.TypedHandler(
|
||||
'refreshJwt',
|
||||
async (requestArg) => {
|
||||
const resultJwt = await Jwt.createJwtForRefreshToken(this, requestArg.refreshToken);
|
||||
const sessionLookup =
|
||||
await this.receptionRef.loginSessionManager.findLoginSessionByRefreshToken(
|
||||
requestArg.refreshToken
|
||||
);
|
||||
|
||||
if (!sessionLookup || sessionLookup.validationStatus === 'invalid') {
|
||||
return {
|
||||
status: 'not found',
|
||||
};
|
||||
}
|
||||
|
||||
if (sessionLookup.validationStatus === 'invalidated') {
|
||||
return {
|
||||
status: 'invalidated',
|
||||
};
|
||||
}
|
||||
|
||||
if (sessionLookup.validationStatus === 'reused') {
|
||||
await sessionLookup.loginSession.invalidate();
|
||||
return {
|
||||
status: 'invalidated',
|
||||
};
|
||||
}
|
||||
|
||||
const rotatedRefreshToken = await sessionLookup.loginSession.getRefreshToken();
|
||||
const resultJwt = await Jwt.createJwtForLoginSession(this, sessionLookup.loginSession);
|
||||
if (!rotatedRefreshToken || !resultJwt) {
|
||||
return {
|
||||
status: 'invalidated',
|
||||
};
|
||||
}
|
||||
return {
|
||||
status: 'loggedIn',
|
||||
jwt: resultJwt,
|
||||
refreshToken: rotatedRefreshToken,
|
||||
};
|
||||
}
|
||||
)
|
||||
@@ -120,19 +151,24 @@ export class JwtManager {
|
||||
await this.pushPublicKeyToClients();
|
||||
}
|
||||
|
||||
public async verifyJWTAndGetData(jwtArg: string): Promise<Jwt> {
|
||||
public async verifyJWTAndGetData(jwtArg: string): Promise<Jwt | null> {
|
||||
const jwtData: plugins.idpInterfaces.data.IJwt = await this.smartjwtInstance.verifyJWTAndGetData(jwtArg);
|
||||
const jwt = await this.CJwt.getInstance({
|
||||
id: jwtData.id,
|
||||
});
|
||||
if (!jwt) {
|
||||
return null;
|
||||
}
|
||||
if (jwt.blocked) {
|
||||
return null;
|
||||
}
|
||||
if (jwt) {
|
||||
const loginSession = await jwt.getLoginSession();
|
||||
if (!loginSession) {
|
||||
if (!loginSession || loginSession.data.invalidated) {
|
||||
await jwt.block();
|
||||
this.blockedJwtIdList.push(jwt.id);
|
||||
if (!this.blockedJwtIdList.includes(jwt.id)) {
|
||||
this.blockedJwtIdList.push(jwt.id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user