1- import { createHash , timingSafeEqual } from 'crypto'
1+ import { createHash , randomBytes , timingSafeEqual } from 'crypto'
22import { readConfigJson , writeConfigJson } from './storage'
33
44const SESSION_COOKIE = 'blog_admin_session'
5- const DEFAULT_SESSION_SECRET = 'blog-local-secret-change-me'
65const ADMIN_CONFIG_FILE = 'admin-auth.json'
76
87type AdminAuthConfig = {
98 passwordHash ?: string
109 initializedAt ?: string
10+ sessionSecret ?: string
1111}
1212
1313function sha256 ( input : string ) {
@@ -37,8 +37,13 @@ export async function initializeAdminPassword(password: string) {
3737 return next
3838}
3939
40- export function getSessionSecret ( ) {
41- return process . env . SESSION_SECRET || DEFAULT_SESSION_SECRET
40+ export async function getSessionSecret ( ) {
41+ if ( process . env . SESSION_SECRET ) return process . env . SESSION_SECRET
42+ const config = await getAdminAuthConfig ( )
43+ if ( config . sessionSecret ) return config . sessionSecret
44+ const sessionSecret = randomBytes ( 32 ) . toString ( 'hex' )
45+ await writeConfigJson ( ADMIN_CONFIG_FILE , { ...config , sessionSecret } )
46+ return sessionSecret
4247}
4348
4449export function getSessionCookieName ( ) {
@@ -61,9 +66,10 @@ export async function verifyAdminPassword(password: string) {
6166
6267export async function createSessionToken ( ) {
6368 const passwordHash = ( await getStoredAdminPasswordHash ( ) ) || 'uninitialized'
64- return sha256 ( `${ getSessionSecret ( ) } :${ passwordHash } ` )
69+ return sha256 ( `${ await getSessionSecret ( ) } :${ passwordHash } ` )
6570}
6671
72+
6773export async function verifySessionToken ( token ?: string | null ) {
6874 if ( ! token ) return false
6975 const expectedToken = await createSessionToken ( )
0 commit comments