66 "fmt"
77 "sync"
88
9+ "aidanwoods.dev/go-paseto"
10+
911 "github.com/heliannuuthus/helios/aegis/config"
1012 "github.com/heliannuuthus/helios/aegis/internal/cache"
1113 "github.com/heliannuuthus/helios/pkg/aegis/key"
@@ -19,9 +21,9 @@ type Service struct {
1921 issuer string
2022 cache * cache.Manager
2123
22- domainKeyStore * key.Store // clientID → domain.Main (includes SSO with id="aegis")
23- serviceKeyStore * key.Store // audience → service.Key (includes SSO with id="aegis")
24- appKeyStore * key.Store // clientID → app.Key
24+ domainKeyProvider key.Provider // clientID → domain.Main (includes SSO with id="aegis")
25+ serviceKeyProvider key.Provider // audience → service.Key (includes SSO with id="aegis")
26+ appKeyProvider key.Provider // clientID → app.Key
2527
2628 domainSigners map [string ]* Signer
2729 domainVerifiers map [string ]* pkgtoken.Verifier
@@ -33,21 +35,21 @@ type Service struct {
3335
3436func NewService (
3537 cache * cache.Manager ,
36- domainKeyStore * key.Store ,
37- serviceKeyStore * key.Store ,
38- appKeyStore * key.Store ,
38+ domainKeyProvider key.Provider ,
39+ serviceKeyProvider key.Provider ,
40+ appKeyProvider key.Provider ,
3941) * Service {
4042 return & Service {
41- issuer : config .GetIssuer (),
42- cache : cache ,
43- domainKeyStore : domainKeyStore ,
44- serviceKeyStore : serviceKeyStore ,
45- appKeyStore : appKeyStore ,
46- domainSigners : make (map [string ]* Signer ),
47- domainVerifiers : make (map [string ]* pkgtoken.Verifier ),
48- serviceEncryptors : make (map [string ]* Encryptor ),
49- serviceDecryptors : make (map [string ]* pkgtoken.Decryptor ),
50- appVerifiers : make (map [string ]* pkgtoken.Verifier ),
43+ issuer : config .GetIssuer (),
44+ cache : cache ,
45+ domainKeyProvider : domainKeyProvider ,
46+ serviceKeyProvider : serviceKeyProvider ,
47+ appKeyProvider : appKeyProvider ,
48+ domainSigners : make (map [string ]* Signer ),
49+ domainVerifiers : make (map [string ]* pkgtoken.Verifier ),
50+ serviceEncryptors : make (map [string ]* Encryptor ),
51+ serviceDecryptors : make (map [string ]* pkgtoken.Decryptor ),
52+ appVerifiers : make (map [string ]* pkgtoken.Verifier ),
5153 }
5254}
5355
@@ -131,14 +133,12 @@ func (s *Service) Verify(ctx context.Context, tokenString string) (Token, error)
131133 if err != nil {
132134 logger .Warnf ("failed to get audience from token: %v" , err )
133135 }
134- claimsJSON , err := s .serviceDecryptor (audience ).Decrypt (ctx , encryptedSub )
136+ innerToken , err := s .serviceDecryptor (audience ).Decrypt (ctx , encryptedSub )
135137 if err != nil {
136138 return nil , fmt .Errorf ("decrypt sub: %w" , err )
137139 }
138140
139- if err := s .unmarshalPayload (t , claimsJSON ); err != nil {
140- return nil , fmt .Errorf ("unmarshal payload: %w" , err )
141- }
141+ s .applyPayload (t , innerToken )
142142 }
143143
144144 return t , nil
@@ -161,7 +161,7 @@ func (s *Service) domainSigner(clientID string) *Signer {
161161 return signer
162162 }
163163
164- signer = NewSigner (s .domainKeyStore , clientID )
164+ signer = NewSigner (s .domainKeyProvider , clientID )
165165 s .domainSigners [clientID ] = signer
166166 return signer
167167}
@@ -181,7 +181,7 @@ func (s *Service) domainVerifier(clientID string) *pkgtoken.Verifier {
181181 return verifier
182182 }
183183
184- verifier = pkgtoken .NewVerifier (s .domainKeyStore , clientID )
184+ verifier = pkgtoken .NewVerifier (s .domainKeyProvider , clientID )
185185 s .domainVerifiers [clientID ] = verifier
186186 return verifier
187187}
@@ -201,7 +201,7 @@ func (s *Service) serviceEncryptor(audience string) *Encryptor {
201201 return encryptor
202202 }
203203
204- encryptor = NewEncryptor (s .serviceKeyStore , audience )
204+ encryptor = NewEncryptor (s .serviceKeyProvider , audience )
205205 s .serviceEncryptors [audience ] = encryptor
206206 return encryptor
207207}
@@ -221,7 +221,7 @@ func (s *Service) serviceDecryptor(audience string) *pkgtoken.Decryptor {
221221 return decryptor
222222 }
223223
224- decryptor = pkgtoken .NewDecryptor (s .serviceKeyStore , audience )
224+ decryptor = pkgtoken .NewDecryptor (s .serviceKeyProvider , audience )
225225 s .serviceDecryptors [audience ] = decryptor
226226 return decryptor
227227}
@@ -241,7 +241,7 @@ func (s *Service) appVerifier(clientID string) *pkgtoken.Verifier {
241241 return verifier
242242 }
243243
244- verifier = pkgtoken .NewVerifier (s .appKeyStore , clientID )
244+ verifier = pkgtoken .NewVerifier (s .appKeyProvider , clientID )
245245 s .appVerifiers [clientID ] = verifier
246246 return verifier
247247}
@@ -252,16 +252,16 @@ func (s *Service) appVerifier(clientID string) *pkgtoken.Verifier {
252252func (* Service ) marshalPayload (t tokendef.Token ) ([]byte , bool ) {
253253 switch v := t .(type ) {
254254 case * tokendef.UserAccessToken :
255- if ! v .HasUser () {
255+ if ! v .Identified () {
256256 return nil , false
257257 }
258- data , err := v .MarshalUserPayload ()
258+ data , err := v .MarshalIdentity ()
259259 if err != nil {
260260 return nil , false
261261 }
262262 return data , true
263263 case * SSOToken :
264- if ! v . HasUser () {
264+ if v . GetIdentities () == nil {
265265 return nil , false
266266 }
267267 data , err := v .MarshalIdentities ()
@@ -278,24 +278,11 @@ func (*Service) needsDecryption(tokenType tokendef.TokenType) bool {
278278 return tokenType == tokendef .TokenTypeUAT || tokenType == tokendef .TokenTypeSSO
279279}
280280
281- // unmarshalPayload decrypts and sets the payload on UAT and SSO tokens.
282- func (* Service ) unmarshalPayload (t tokendef.Token , data []byte ) error {
281+ func (* Service ) applyPayload (t tokendef.Token , inner * paseto.Token ) {
283282 switch v := t .(type ) {
284283 case * tokendef.UserAccessToken :
285- info , err := tokendef .UnmarshalUserInfo (data )
286- if err != nil {
287- return err
288- }
289- v .SetUserInfo (info )
290- return nil
284+ v .SetIdentity (inner )
291285 case * SSOToken :
292- identities , err := UnmarshalIdentities (data )
293- if err != nil {
294- return err
295- }
296- v .SetIdentities (identities )
297- return nil
298- default :
299- return fmt .Errorf ("token type %s does not support payload decryption" , t .Type ())
286+ v .SetIdentities (inner )
300287 }
301288}
0 commit comments