Allow legacy stateless tokens that were minted without a password fingerprint.

This commit is contained in:
Francis Cao
2026-06-23 13:24:55 -07:00
parent 3b792720af
commit 3888ec6f4f
2 changed files with 11 additions and 1 deletions
+9
View File
@@ -66,6 +66,15 @@ describe('checkAuth password fingerprint', () => {
expect(result?.user?.id).toBe('user-1');
});
test('authorizes a legacy stateless token that does not include a password fingerprint', async () => {
parseSecureTokenMock.mockReturnValue({ userId: 'user-1' } as any);
mockUser();
const result = await checkAuth(authedRequest());
expect(result?.user?.id).toBe('user-1');
});
test('rejects a stateless token whose fingerprint predates a password change', async () => {
// Token minted against the old password must stop working once the password changes.
parseSecureTokenMock.mockReturnValue({
+2 -1
View File
@@ -32,7 +32,8 @@ export async function checkAuth(request: Request) {
user = await getUser(userId, { includePassword: true });
// Reject tokens issued before the current password.
if (user && hash(user.password) !== payload.pwd) {
// Allow legacy stateless tokens that were minted without a password fingerprint.
if (user && payload.pwd && hash(user.password) !== payload.pwd) {
user = null;
}
} else if (redis.enabled && authKey) {