@@ -7,10 +7,9 @@ import {
77 KeyValueStorage
88} from '@solid/community-server' ;
99import { randomUUID } from 'node:crypto' ;
10+ import { ClaimSet } from '../credentials/ClaimSet' ;
1011import { SerializedToken , TokenFactory } from './TokenFactory' ;
1112import { AccessToken } from './AccessToken' ;
12- import { array , reType } from '../util/ReType' ;
13- import { Permission } from '../views/Permission' ;
1413
1514const AUD = 'solid' ;
1615
@@ -35,7 +34,7 @@ export class JwtTokenFactory extends TokenFactory {
3534 constructor (
3635 protected readonly keyGen : JwkGenerator ,
3736 protected readonly issuer : string ,
38- protected readonly tokenStore : KeyValueStorage < string , AccessToken > ,
37+ protected readonly tokenStore : KeyValueStorage < string , { token : AccessToken , claims ?: ClaimSet } > ,
3938 protected readonly params : JwtTokenParams = { expirationTime : '30m' , aud : 'solid' } ,
4039 ) {
4140 super ( ) ;
@@ -44,9 +43,10 @@ export class JwtTokenFactory extends TokenFactory {
4443 /**
4544 * Serializes an Access Token into a JWT
4645 * @param {AccessToken } token - authenticated and authorized principal
46+ * @param claims - claims used to acquire this token
4747 * @return {Promise<SerializedToken> } - access token response
4848 */
49- public async serialize ( token : AccessToken ) : Promise < SerializedToken > {
49+ public async serialize ( token : AccessToken , claims ?: ClaimSet ) : Promise < SerializedToken > {
5050 const key = await this . keyGen . getPrivateKey ( ) ;
5151 const jwk = await importJWK ( key , key . alg ) ;
5252 const jwt = await new SignJWT ( { permissions : token . permissions , contract : token . contract } )
@@ -59,37 +59,21 @@ export class JwtTokenFactory extends TokenFactory {
5959 . sign ( jwk ) ;
6060
6161 this . logger . debug ( `Issued new JWT Token ${ JSON . stringify ( token ) } ` ) ;
62- await this . tokenStore . set ( jwt , token ) ;
62+ await this . tokenStore . set ( jwt , { token, claims } ) ;
6363 return { token : jwt , tokenType : 'Bearer' } ;
6464 }
6565
6666 /**
6767 * Deserializes a JWT into an Access Token
6868 * @param {string } token - JWT access token
69- * @return {Promise<AccessToken> } - deserialized access token
69+ * @return {Promise<AccessToken> } - deserialized access token and claims
7070 */
71- public async deserialize ( token : string ) : Promise < AccessToken > {
72- const key = await this . keyGen . getPublicKey ( ) ;
73- const jwk = await importJWK ( key , key . alg ) ;
74- try {
75- const { payload } = await jwtVerify ( token , jwk , {
76- issuer : this . issuer ,
77- audience : this . params . aud ?? AUD ,
78- } ) ;
79-
80- if ( ! payload . permissions ) {
81- throw new Error ( 'missing required "permissions" claim.' ) ;
82- }
83-
84- const permissions = payload . permissions ;
85-
86- reType ( permissions , array ( Permission ) ) ;
87-
88- return { permissions } ;
89- } catch ( error : unknown ) {
90- const msg = `Invalid Access Token provided, error while parsing: ${ createErrorMessage ( error ) } ` ;
91- this . logger . warn ( msg ) ;
92- throw new BadRequestHttpError ( msg ) ;
71+ public async deserialize ( token : string ) : Promise < { token : AccessToken , claims ?: ClaimSet } > {
72+ // TODO: might want to move this behaviour outside of this class as it is the same for all factories
73+ const result = await this . tokenStore . get ( token ) ;
74+ if ( ! result ) {
75+ throw new BadRequestHttpError ( 'Invalid Access Token provided' ) ;
9376 }
77+ return result ;
9478 }
9579}
0 commit comments