Token Refresh/Upgrade와 관련된 DB 제약 위반 수정

This commit is contained in:
static
2024-12-31 05:00:03 +09:00
parent 08a23b61b2
commit 0f87975040
3 changed files with 48 additions and 23 deletions

View File

@@ -36,7 +36,7 @@ export const generateRSASigKeyPair = async () => {
return keyPair; return keyPair;
}; };
export const makeRSAKeyNonextractable = async (key: CryptoKey, type: RSAKeyType) => { export const makeRSAEncKeyNonextractable = async (key: CryptoKey, type: RSAKeyType) => {
const { format, key: exportedKey } = await exportRSAKey(key, type); const { format, key: exportedKey } = await exportRSAKey(key, type);
return await window.crypto.subtle.importKey( return await window.crypto.subtle.importKey(
format, format,
@@ -50,6 +50,20 @@ export const makeRSAKeyNonextractable = async (key: CryptoKey, type: RSAKeyType)
); );
}; };
export const makeRSASigKeyNonextractable = async (key: CryptoKey, type: RSAKeyType) => {
const { format, key: exportedKey } = await exportRSAKey(key, type);
return await window.crypto.subtle.importKey(
format,
exportedKey,
{
name: "RSA-PSS",
hash: "SHA-256",
} satisfies RsaHashedImportParams,
false,
[type === "public" ? "verify" : "sign"],
);
};
const exportRSAKey = async (key: CryptoKey, type: RSAKeyType) => { const exportRSAKey = async (key: CryptoKey, type: RSAKeyType) => {
const format = type === "public" ? ("spki" as const) : ("pkcs8" as const); const format = type === "public" ? ("spki" as const) : ("pkcs8" as const);
return { return {

View File

@@ -38,15 +38,20 @@ export const getRefreshToken = async (tokenId: string) => {
}; };
export const rotateRefreshToken = async (oldTokenId: string, newTokenId: string) => { export const rotateRefreshToken = async (oldTokenId: string, newTokenId: string) => {
const res = await db return await db.transaction(async (tx) => {
.update(refreshToken) await tx
.set({ .delete(tokenUpgradeChallenge)
id: newTokenId, .where(eq(tokenUpgradeChallenge.refreshTokenId, oldTokenId));
expiresAt: expiresAt(), const res = await db
}) .update(refreshToken)
.where(eq(refreshToken.id, oldTokenId)) .set({
.execute(); id: newTokenId,
return res.changes > 0; expiresAt: expiresAt(),
})
.where(eq(refreshToken.id, oldTokenId))
.execute();
return res.changes > 0;
});
}; };
export const upgradeRefreshToken = async ( export const upgradeRefreshToken = async (
@@ -54,16 +59,21 @@ export const upgradeRefreshToken = async (
newTokenId: string, newTokenId: string,
clientId: number, clientId: number,
) => { ) => {
const res = await db return await db.transaction(async (tx) => {
.update(refreshToken) await tx
.set({ .delete(tokenUpgradeChallenge)
id: newTokenId, .where(eq(tokenUpgradeChallenge.refreshTokenId, oldTokenId));
clientId, const res = await tx
expiresAt: expiresAt(), .update(refreshToken)
}) .set({
.where(eq(refreshToken.id, oldTokenId)) id: newTokenId,
.execute(); clientId,
return res.changes > 0; expiresAt: expiresAt(),
})
.where(eq(refreshToken.id, oldTokenId))
.execute();
return res.changes > 0;
});
}; };
export const revokeRefreshToken = async (tokenId: string) => { export const revokeRefreshToken = async (tokenId: string) => {

View File

@@ -1,7 +1,8 @@
import { import {
generateRSAEncKeyPair, generateRSAEncKeyPair,
generateRSASigKeyPair, generateRSASigKeyPair,
makeRSAKeyNonextractable, makeRSAEncKeyNonextractable,
makeRSASigKeyNonextractable,
exportRSAKeyToBase64, exportRSAKeyToBase64,
generateAESKey, generateAESKey,
makeAESKeyNonextractable, makeAESKeyNonextractable,
@@ -16,11 +17,11 @@ export const generateKeyPairs = async () => {
keyPairsStore.set({ keyPairsStore.set({
encKeyPair: { encKeyPair: {
publicKey: encKeyPair.publicKey, publicKey: encKeyPair.publicKey,
privateKey: await makeRSAKeyNonextractable(encKeyPair.privateKey, "private"), privateKey: await makeRSAEncKeyNonextractable(encKeyPair.privateKey, "private"),
}, },
sigKeyPair: { sigKeyPair: {
publicKey: sigKeyPair.publicKey, publicKey: sigKeyPair.publicKey,
privateKey: await makeRSAKeyNonextractable(sigKeyPair.privateKey, "private"), privateKey: await makeRSASigKeyNonextractable(sigKeyPair.privateKey, "private"),
}, },
}); });