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,6 +38,10 @@ export const getRefreshToken = async (tokenId: string) => {
}; };
export const rotateRefreshToken = async (oldTokenId: string, newTokenId: string) => { export const rotateRefreshToken = async (oldTokenId: string, newTokenId: string) => {
return await db.transaction(async (tx) => {
await tx
.delete(tokenUpgradeChallenge)
.where(eq(tokenUpgradeChallenge.refreshTokenId, oldTokenId));
const res = await db const res = await db
.update(refreshToken) .update(refreshToken)
.set({ .set({
@@ -47,6 +51,7 @@ export const rotateRefreshToken = async (oldTokenId: string, newTokenId: string)
.where(eq(refreshToken.id, oldTokenId)) .where(eq(refreshToken.id, oldTokenId))
.execute(); .execute();
return res.changes > 0; return res.changes > 0;
});
}; };
export const upgradeRefreshToken = async ( export const upgradeRefreshToken = async (
@@ -54,7 +59,11 @@ export const upgradeRefreshToken = async (
newTokenId: string, newTokenId: string,
clientId: number, clientId: number,
) => { ) => {
const res = await db return await db.transaction(async (tx) => {
await tx
.delete(tokenUpgradeChallenge)
.where(eq(tokenUpgradeChallenge.refreshTokenId, oldTokenId));
const res = await tx
.update(refreshToken) .update(refreshToken)
.set({ .set({
id: newTokenId, id: newTokenId,
@@ -64,6 +73,7 @@ export const upgradeRefreshToken = async (
.where(eq(refreshToken.id, oldTokenId)) .where(eq(refreshToken.id, oldTokenId))
.execute(); .execute();
return res.changes > 0; 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"),
}, },
}); });