11import {
2- create ,
3- decode ,
42 getCookies ,
3+ ironDefaults ,
54 MiddlewareHandlerContext ,
5+ seal ,
66 setCookie ,
7- verify ,
7+ unseal ,
88} from "../deps.ts" ;
99import { type CookieOptions } from "./cookie_option.ts" ;
1010import { Session } from "../session.ts" ;
1111import type { WithSession } from "./interface.ts" ;
1212
13- export function key ( ) {
14- const key = Deno . env . get ( "APP_KEY" ) ;
15-
16- if ( ! key ) {
17- console . warn (
18- "[FRESH SESSION] Warning: We didn't detect a env variable `APP_KEY`, if you are in production please fix this ASAP to avoid any security issue." ,
19- ) ;
20- }
21-
22- return crypto . subtle . importKey (
23- "raw" ,
24- new TextEncoder ( ) . encode ( key || "not-secret" ) ,
25- { name : "HMAC" , hash : "SHA-512" } ,
26- false ,
27- [ "sign" , "verify" ] ,
28- ) ;
29- }
30-
3113export function createCookieSessionStorage ( cookieOptions ?: CookieOptions ) {
3214 let cookieOptionsParam = cookieOptions ;
3315 if ( ! cookieOptionsParam ) {
@@ -38,34 +20,43 @@ export function createCookieSessionStorage(cookieOptions?: CookieOptions) {
3820}
3921
4022export class CookieSessionStorage {
41- #key: CryptoKey ;
4223 #cookieOptions: CookieOptions ;
4324
44- constructor ( key : CryptoKey , cookieOptions : CookieOptions ) {
45- this . #key = key ;
25+ constructor ( cookieOptions : CookieOptions ) {
4626 this . #cookieOptions = cookieOptions ;
4727 }
4828
49- static async init ( cookieOptions : CookieOptions ) {
50- return new this ( await key ( ) , cookieOptions ) ;
29+ static init ( cookieOptions : CookieOptions ) {
30+ return new this ( cookieOptions ) ;
5131 }
5232
5333 create ( ) {
5434 return new Session ( ) ;
5535 }
5636
5737 exists ( sessionId : string ) {
58- return verify ( sessionId , this . #key)
38+ return unseal (
39+ globalThis . crypto ,
40+ sessionId ,
41+ Deno . env . get ( "APP_KEY" ) as string ,
42+ ironDefaults ,
43+ )
5944 . then ( ( ) => true )
6045 . catch ( ( e ) => {
61- console . warn ( "Invalid JWT token , creating new session..." ) ;
46+ console . warn ( "Invalid session , creating new session..." ) ;
6247 return false ;
6348 } ) ;
6449 }
6550
66- get ( sessionId : string ) {
67- const [ , payload ] = decode ( sessionId ) ;
68- const { _flash = { } , ...data } = payload ;
51+ async get ( sessionId : string ) {
52+ const decryptedData = await unseal (
53+ globalThis . crypto ,
54+ sessionId ,
55+ Deno . env . get ( "APP_KEY" ) as string ,
56+ ironDefaults ,
57+ ) ;
58+
59+ const { _flash = { } , ...data } = decryptedData ;
6960 return new Session ( data as object , _flash ) ;
7061 }
7162
@@ -74,13 +65,16 @@ export class CookieSessionStorage {
7465 this . keyRotate ( ) ;
7566 }
7667
68+ const encryptedData = await seal (
69+ globalThis . crypto ,
70+ { ...session . data , _flash : session . flashedData } ,
71+ Deno . env . get ( "APP_KEY" ) as string ,
72+ ironDefaults ,
73+ ) ;
74+
7775 setCookie ( response . headers , {
7876 name : "sessionId" ,
79- value : await create (
80- { alg : "HS512" , typ : "JWT" } ,
81- { ...session . data , _flash : session . flashedData } ,
82- this . #key,
83- ) ,
77+ value : encryptedData ,
8478 path : "/" ,
8579 ...this . #cookieOptions,
8680 } ) ;
0 commit comments