-
Notifications
You must be signed in to change notification settings - Fork 0
/
token_usecase.go
76 lines (63 loc) · 2.42 KB
/
token_usecase.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package usecase
import (
"context"
"crypto/rsa"
"log"
"github.com/jllanes-ss/avisos/account/domain"
"github.com/jllanes-ss/avisos/account/domain/apperrors"
)
type tokenUseCase struct {
TokenRepository domain.TokenRepository
PrivKey *rsa.PrivateKey
PubKey *rsa.PublicKey
RefreshSecret string
IDExpirationSecs int64
RefreshExpirationSecs int64
}
type TUCConfig struct {
TokenRepository domain.TokenRepository
PrivKey *rsa.PrivateKey
PubKey *rsa.PublicKey
RefreshSecret string
IDExpirationSecs int64
RefreshExpirationSecs int64
}
// NewUserService will create new an userService object representation of domain.userService interface
func NewTokenUseCase(c *TUCConfig) domain.TokenUseCase {
return &tokenUseCase{
TokenRepository: c.TokenRepository,
PrivKey: c.PrivKey,
PubKey: c.PubKey,
RefreshSecret: c.RefreshSecret,
IDExpirationSecs: c.IDExpirationSecs,
RefreshExpirationSecs: c.RefreshExpirationSecs,
}
}
func (s *tokenUseCase) NewPairFromUser(ctx context.Context, u *domain.User, prevTokenID string) (*domain.TokenPair, error) {
if prevTokenID != "" {
if err := s.TokenRepository.DeleteRefreshToken(ctx, u.ID.String(), prevTokenID); err != nil {
log.Printf("Could not delete previous refreshToken for uid: %v, tokenID: %v\n", u.ID.String(), prevTokenID)
return nil, err
}
}
// No need to use a repository for idToken as it is unrelated to any data source
idToken, err := generateIDToken(u, s.PrivKey, s.IDExpirationSecs)
if err != nil {
log.Printf("Error generating idToken for uid: %v. Error: %v\n", u.ID, err.Error())
return nil, apperrors.NewInternal()
}
refreshToken, err := generateRefreshToken(u.ID, s.RefreshSecret, s.RefreshExpirationSecs)
if err != nil {
log.Printf("Error generating refreshToken for uid: %v. Error: %v\n", u.ID, err.Error())
return nil, apperrors.NewInternal()
}
// set freshly minted refresh token to valid list
if err := s.TokenRepository.SetRefreshToken(ctx, u.ID.String(), refreshToken.ID.String(), refreshToken.ExpiresIn); err != nil {
log.Printf("Error storing tokenID for uid: %v. Error: %v\n", u.ID, err.Error())
return nil, apperrors.NewInternal()
}
return &domain.TokenPair{
IDToken: domain.IDToken{SS: idToken},
RefreshToken: domain.RefreshToken{SS: refreshToken.SS, ID: refreshToken.ID, UID: u.ID},
}, nil
}