Skip to content

Commit a816b3f

Browse files
committed
refactored jwt related to struct.
1 parent 214331d commit a816b3f

File tree

4 files changed

+177
-123
lines changed

4 files changed

+177
-123
lines changed

default_use_case.go

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,11 @@ import (
44
"context"
55
"errors"
66
"fmt"
7-
"github.com/golang-jwt/jwt/v5"
8-
97
"github.com/techpro-studio/goauthlib/oauth"
108
"github.com/techpro-studio/gohttplib"
119
"math/rand"
1210
)
1311

14-
type Config struct {
15-
blinder string
16-
signingMethod jwt.SigningMethod
17-
signingKey any
18-
softDeleteUserIfNoServices bool
19-
}
20-
21-
func NewConfig(blinder string, signingMethod jwt.SigningMethod, signingKey any, softDeleteUserIfNoServices bool) *Config {
22-
return &Config{blinder: blinder, signingMethod: signingMethod, signingKey: signingKey, softDeleteUserIfNoServices: softDeleteUserIfNoServices}
23-
}
24-
2512
type OTPDelivery interface {
2613
SendOTP(ctx context.Context, destination, otp string) error
2714
}
@@ -58,19 +45,24 @@ func (d DoNothingUseCaseCallback) OnRemoveServiceFrom(ctx context.Context, user
5845
}
5946

6047
type DefaultUseCase struct {
61-
SocialProviders map[string]oauth.SocialProvider
62-
Deliveries map[string]OTPDelivery
63-
repository Repository
64-
callback UserCaseCallback
65-
config Config
48+
SocialProviders map[string]oauth.SocialProvider
49+
Deliveries map[string]OTPDelivery
50+
repository Repository
51+
callback UserCaseCallback
52+
jwtConfig JWTConfig
53+
softDeleteUserIfNoServices bool
54+
}
55+
56+
func (useCase *DefaultUseCase) SetSoftDeleteUserIfNoServices(softDeleteUserIfNoServices bool) {
57+
useCase.softDeleteUserIfNoServices = softDeleteUserIfNoServices
6658
}
6759

6860
func (useCase *DefaultUseCase) UpsertUser(ctx context.Context, entity AuthorizationEntity, info map[string]any) (*Response, error) {
6961
user, err := useCase.repository.UpsertForEntity(ctx, entity, info)
7062
if err != nil {
7163
return nil, err
7264
}
73-
token, err := GenerateTokenFromModel(*user, useCase.config.blinder, useCase.config.signingMethod, useCase.config.signingKey)
65+
token, err := useCase.jwtConfig.GenerateTokenFromModel(*user)
7466
if err != nil {
7567
return nil, err
7668
}
@@ -93,8 +85,8 @@ func (useCase *DefaultUseCase) RegisterOTPDelivery(key string, delivery OTPDeliv
9385
useCase.Deliveries[key] = delivery
9486
}
9587

96-
func NewDefaultUseCase(repository Repository, config Config, callback UserCaseCallback) *DefaultUseCase {
97-
return &DefaultUseCase{repository: repository, SocialProviders: map[string]oauth.SocialProvider{}, Deliveries: map[string]OTPDelivery{}, config: config, callback: callback}
88+
func NewDefaultUseCase(repository Repository, config JWTConfig, callback UserCaseCallback) *DefaultUseCase {
89+
return &DefaultUseCase{repository: repository, SocialProviders: map[string]oauth.SocialProvider{}, Deliveries: map[string]OTPDelivery{}, jwtConfig: config, callback: callback}
9890
}
9991

10092
func (useCase *DefaultUseCase) RegisterSocialProvider(key string, provider oauth.SocialProvider) {
@@ -169,7 +161,7 @@ func (useCase *DefaultUseCase) getInfoFromProvider(ctx context.Context, payload
169161
}
170162

171163
func (useCase *DefaultUseCase) generateResponseFor(usr *User, userInfo map[string]interface{}) (*Response, error) {
172-
jsonWebToken, err := GenerateTokenFromModel(*usr, useCase.config.blinder, useCase.config.signingMethod, useCase.config.signingKey)
164+
jsonWebToken, err := useCase.jwtConfig.GenerateTokenFromModel(*usr)
173165
if err != nil {
174166
return nil, gohttplib.HTTP400(err.Error())
175167
}
@@ -189,7 +181,7 @@ func (useCase *DefaultUseCase) VerifyDelete(ctx context.Context, user User, code
189181
}
190182

191183
func (useCase *DefaultUseCase) ForceDelete(ctx context.Context, user User) error {
192-
useCase.repository.RemoveService(ctx, user.ID, useCase.config.softDeleteUserIfNoServices, func(ctx context.Context, userId string) error {
184+
useCase.repository.RemoveService(ctx, user.ID, useCase.softDeleteUserIfNoServices, func(ctx context.Context, userId string) error {
193185
return useCase.callback.OnRemoveServiceFrom(ctx, &user)
194186
})
195187
for _, entity := range user.Entities {

functions.go renamed to jwt.go

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,44 @@ import (
1212
"strings"
1313
)
1414

15-
func GenerateTokenFromModel(model User, blinder string, signingMethod jwt.SigningMethod, signingKey any) (string, error) {
16-
hash := GenerateTokenHash(model, blinder)
15+
type JWTConfig struct {
16+
signingMethod jwt.SigningMethod
17+
signingKey any
18+
verificationKey any
19+
blinder string
20+
}
21+
22+
func (config JWTConfig) SigningMethod() jwt.SigningMethod {
23+
return config.signingMethod
24+
}
25+
26+
func (config JWTConfig) SigningKey() any {
27+
return config.signingKey
28+
}
29+
30+
func (config JWTConfig) VerificationKey() any {
31+
return config.verificationKey
32+
}
33+
34+
func (config JWTConfig) Blinder() string {
35+
return config.blinder
36+
}
37+
38+
func (config JWTConfig) Copy() JWTConfig {
39+
return JWTConfig{
40+
signingMethod: config.signingMethod,
41+
signingKey: config.signingKey,
42+
verificationKey: config.verificationKey,
43+
blinder: config.blinder,
44+
}
45+
}
46+
47+
func NewJWTConfig(signingMethod jwt.SigningMethod, signingKey any, verificationKey any, blinder string) *JWTConfig {
48+
return &JWTConfig{signingMethod: signingMethod, signingKey: signingKey, verificationKey: verificationKey, blinder: blinder}
49+
}
50+
51+
func (config JWTConfig) GenerateTokenFromModel(model User) (string, error) {
52+
hash := GenerateTokenHash(model, config.blinder)
1753

1854
claims := struct {
1955
Hash string `json:"hash"`
@@ -25,21 +61,21 @@ func GenerateTokenFromModel(model User, blinder string, signingMethod jwt.Signin
2561
Issuer: "auth",
2662
},
2763
}
28-
tokenObj := jwt.NewWithClaims(signingMethod, claims)
64+
tokenObj := jwt.NewWithClaims(config.signingMethod, claims)
2965

30-
token, err := tokenObj.SignedString(signingKey)
66+
token, err := tokenObj.SignedString(config.signingKey)
3167
if err != nil {
3268
return "", err
3369
}
3470
return token, nil
3571
}
3672

37-
func GetClaimsFromToken(token string, currentSigningMethod jwt.SigningMethod, currentSigningKey any) (map[string]any, error) {
73+
func (config JWTConfig) GetClaimsFromToken(token string) (map[string]any, error) {
3874
tokenObj, err := jwt.ParseWithClaims(token, &jwt.MapClaims{}, func(token *jwt.Token) (any, error) {
39-
if token.Method.Alg() != currentSigningMethod.Alg() {
75+
if token.Method.Alg() != config.signingMethod.Alg() {
4076
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
4177
}
42-
return currentSigningKey, nil
78+
return config.verificationKey, nil
4379
})
4480

4581
if err != nil {
@@ -79,7 +115,7 @@ func GenerateTokenHash(model User, blinder string) string {
79115
return hex.EncodeToString(sha.Sum(nil))
80116
}
81117

82-
func SafeExtractUserIdFromHeader(h http.Header, currentSigningMethod jwt.SigningMethod, signingKey any) (string, error) {
118+
func (config JWTConfig) SafeExtractUserIdFromHeader(h http.Header) (string, error) {
83119
// Check if Authorization header exists
84120
authHeader, ok := h["Authorization"]
85121
if !ok || len(authHeader) == 0 {
@@ -94,7 +130,7 @@ func SafeExtractUserIdFromHeader(h http.Header, currentSigningMethod jwt.Signing
94130

95131
token := tokenParts[1]
96132

97-
claims, err := GetClaimsFromToken(token, currentSigningMethod, signingKey)
133+
claims, err := config.GetClaimsFromToken(token)
98134
if err != nil {
99135
return "", err
100136
}
@@ -112,8 +148,8 @@ func SafeExtractUserIdFromHeader(h http.Header, currentSigningMethod jwt.Signing
112148
return userIdFromJwt, nil
113149
}
114150

115-
func GetValidUserFromToken(token string, config Config) (*User, error) {
116-
claims, err := GetClaimsFromToken(token, config.signingMethod, config.signingKey)
151+
func (config JWTConfig) GetValidUserFromToken(token string) (*User, error) {
152+
claims, err := config.GetClaimsFromToken(token)
117153
if err != nil {
118154
return nil, err
119155
}

0 commit comments

Comments
 (0)