@@ -36,7 +36,7 @@ export function defineOAuthBlueskyEventHandler({ config, onSuccess, onError }: O
36
36
const clientMetadata = getAtprotoClientMetadata ( event , 'bluesky' , config )
37
37
const scopes = clientMetadata . scope ?. split ( ' ' ) ?? [ ]
38
38
39
- const sessionStore = new SessionStore ( event )
39
+ const sessionStore = new SessionStore ( )
40
40
const stateStore = new StateStore ( event )
41
41
42
42
const client = new NodeOAuthClient ( {
@@ -86,12 +86,12 @@ export function defineOAuthBlueskyEventHandler({ config, onSuccess, onError }: O
86
86
87
87
try {
88
88
const { session } = await client . callback ( new URLSearchParams ( query as Record < string , string > ) )
89
- const sessionInfo = await sessionStore . get ( )
89
+ const sessionInfo = await sessionStore . get ( session . did )
90
90
const profile = scopes . includes ( 'transition:generic' )
91
91
? ( await new Agent ( session ) . getProfile ( { actor : session . did } ) ) . data
92
92
: null
93
93
94
- sessionStore . del ( )
94
+ sessionStore . del ( session . did )
95
95
96
96
return onSuccess ( event , {
97
97
user : profile ?? { did : session . did } ,
@@ -111,7 +111,7 @@ export function defineOAuthBlueskyEventHandler({ config, onSuccess, onError }: O
111
111
}
112
112
113
113
export class StateStore implements NodeSavedStateStore {
114
- private readonly stateKey = 'oauth: bluesky:stat '
114
+ private readonly stateKey = 'oauth- bluesky-state '
115
115
116
116
constructor ( private event : H3Event ) { }
117
117
@@ -122,7 +122,12 @@ export class StateStore implements NodeSavedStateStore {
122
122
}
123
123
124
124
async set ( key : string , val : NodeSavedState ) {
125
- setCookie ( this . event , this . stateKey , btoa ( JSON . stringify ( val ) ) )
125
+ setCookie ( this . event , this . stateKey , btoa ( JSON . stringify ( val ) ) , {
126
+ path : '/' ,
127
+ httpOnly : true ,
128
+ secure : true ,
129
+ sameSite : 'lax' ,
130
+ } )
126
131
}
127
132
128
133
async del ( ) {
@@ -131,21 +136,18 @@ export class StateStore implements NodeSavedStateStore {
131
136
}
132
137
133
138
export class SessionStore implements NodeSavedSessionStore {
134
- private readonly sessionKey = 'oauth:bluesky:session'
135
-
136
- constructor ( private event : H3Event ) { }
139
+ private store : Record < string , NodeSavedSession > = { }
137
140
138
- async get ( ) : Promise < NodeSavedSession | undefined > {
139
- const result = getCookie ( this . event , this . sessionKey )
140
- if ( ! result ) return
141
- return JSON . parse ( atob ( result ) )
141
+ async get ( key : string ) : Promise < NodeSavedSession | undefined > {
142
+ return this . store [ key ]
142
143
}
143
144
144
145
async set ( key : string , val : NodeSavedSession ) {
145
- setCookie ( this . event , this . sessionKey , btoa ( JSON . stringify ( val ) ) )
146
+ this . store [ key ] = val
146
147
}
147
148
148
- async del ( ) {
149
- deleteCookie ( this . event , this . sessionKey )
149
+ async del ( key : string ) {
150
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
151
+ delete this . store [ key ]
150
152
}
151
153
}
0 commit comments