@@ -55,14 +55,8 @@ export class AuthService {
5555 await this . prisma . sessions . create ( {
5656 data : { token, ipAddress, userAgent, user : { connect : { id } } } ,
5757 } ) ;
58- const payload : AccessTokenClaims = {
59- sub : `user${ id } ` ,
60- scopes : [ 'example-scope' ] ,
61- } ;
6258 return {
63- accessToken : this . jwtService . sign ( payload , {
64- expiresIn : this . configService . get < string > ( 'security.accessTokenExpiry' ) ,
65- } ) ,
59+ accessToken : await this . getAccessToken ( id ) ,
6660 refreshToken : token ,
6761 } ;
6862 }
@@ -133,15 +127,37 @@ export class AuthService {
133127 data : { ipAddress, userAgent } ,
134128 } ) ;
135129 return {
136- accessToken : this . jwtService . sign (
137- { sub : `user${ session . user . id } ` } ,
138- {
139- expiresIn : this . configService . get < string > (
140- 'security.accessTokenExpiry' ,
141- ) ,
142- } ,
143- ) ,
130+ accessToken : await this . getAccessToken ( session . user . id ) ,
144131 refreshToken : token ,
145132 } ;
146133 }
134+
135+ private async getAccessToken ( userId : number ) : Promise < string > {
136+ const scopes = await this . getScopes ( userId ) ;
137+ const payload : AccessTokenClaims = {
138+ sub : `user${ userId } ` ,
139+ scopes,
140+ } ;
141+ return this . jwtService . sign ( payload , {
142+ expiresIn : this . configService . get < string > ( 'security.accessTokenExpiry' ) ,
143+ } ) ;
144+ }
145+
146+ async getScopes ( userId : number ) : Promise < string [ ] > {
147+ const scopes : string [ ] = [ `user${ userId } :*` ] ;
148+ const memberships = await this . prisma . memberships . findMany ( {
149+ where : { user : { id : userId } } ,
150+ select : { id : true , role : true , group : { select : { id : true } } } ,
151+ } ) ;
152+ memberships . forEach ( membership => {
153+ scopes . push ( `membership${ membership . id } :*` ) ;
154+ if ( membership . role === 'OWNER' )
155+ scopes . push ( `group${ membership . group . id } :*` ) ;
156+ if ( membership . role === 'ADMIN' )
157+ scopes . push ( `group${ membership . group . id } :write-*` ) ;
158+ if ( membership . role !== 'OWNER' )
159+ scopes . push ( `group${ membership . group . id } :read-*` ) ;
160+ } ) ;
161+ return scopes ;
162+ }
147163}
0 commit comments