Skip to content

Commit 714d2e0

Browse files
Merge pull request #285 from supertokens/logging/enhance-debug-logs
chore: Add additional debug logs for session functions
2 parents ebc16c1 + 436e079 commit 714d2e0

File tree

7 files changed

+48
-1
lines changed

7 files changed

+48
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [unreleased]
99

10+
## [0.12.3] - 2023-05-22
11+
12+
### Added
13+
14+
- Adds additional debug logs whenever the SDK returns a `TryRefreshTokenError` or `UnauthorizedError` to make debugging easier
15+
1016
## [0.12.2] - 2023-05-19
1117

1218
- Adds additional tests for the session recipe

recipe/emailverification/api/implementation.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func MakeAPIImplementation() evmodels.APIInterface {
3838
err := sessionContainer.FetchAndSetClaimWithContext(evclaims.EmailVerificationClaim, userContext)
3939
if err != nil {
4040
if err.Error() == "UNKNOWN_USER_ID" {
41+
supertokens.LogDebugMessage("verifyEmailPOST: Returning UnauthorizedError because the User Id provided is unknown")
4142
return evmodels.VerifyEmailPOSTResponse{}, sessErrors.UnauthorizedError{Msg: "Unknown User ID provided"}
4243
}
4344
return evmodels.VerifyEmailPOSTResponse{}, err
@@ -61,6 +62,7 @@ func MakeAPIImplementation() evmodels.APIInterface {
6162
err := sessionContainer.FetchAndSetClaimWithContext(evclaims.EmailVerificationClaim, userContext)
6263
if err != nil {
6364
if err.Error() == "UNKNOWN_USER_ID" {
65+
supertokens.LogDebugMessage("isEmailVerifiedGET: Returning UnauthorizedError because the User Id provided is unknown")
6466
return evmodels.IsEmailVerifiedGETResponse{}, sessErrors.UnauthorizedError{Msg: "Unknown User ID provided"}
6567
}
6668
return evmodels.IsEmailVerifiedGETResponse{}, err
@@ -88,6 +90,7 @@ func MakeAPIImplementation() evmodels.APIInterface {
8890
return evmodels.GenerateEmailVerifyTokenPOSTResponse{}, err
8991
}
9092
if email.UnknownUserIDError != nil {
93+
supertokens.LogDebugMessage("generateEmailVerifyTokenPOST: Returning UnauthorizedError because the User Id provided is unknown")
9194
return evmodels.GenerateEmailVerifyTokenPOSTResponse{}, sessErrors.UnauthorizedError{Msg: "Unknown User ID provided"}
9295
}
9396
if email.EmailDoesNotExistError != nil {

recipe/session/accessToken.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ package session
1717

1818
import (
1919
"errors"
20+
"fmt"
2021
"github.com/MicahParks/keyfunc"
2122
"github.com/golang-jwt/jwt/v4"
2223
sterrors "github.com/supertokens/supertokens-golang/recipe/session/errors"
2324
"github.com/supertokens/supertokens-golang/recipe/session/sessmodels"
25+
"github.com/supertokens/supertokens-golang/supertokens"
2426
"strings"
2527
)
2628

@@ -41,6 +43,7 @@ func GetInfoFromAccessToken(jwtInfo sessmodels.ParsedJWTInfo, jwks keyfunc.JWKS,
4143
if jwtInfo.Version >= 3 {
4244
parsedToken, parseError := jwt.Parse(jwtInfo.RawTokenString, jwks.Keyfunc)
4345
if parseError != nil {
46+
supertokens.LogDebugMessage(fmt.Sprintf("GetInfoFromAccessToken: Returning TryRefreshTokenError because access token parsing failed - %s", parseError))
4447
return nil, sterrors.TryRefreshTokenError{
4548
Msg: parseError.Error(),
4649
}
@@ -49,6 +52,7 @@ func GetInfoFromAccessToken(jwtInfo sessmodels.ParsedJWTInfo, jwks keyfunc.JWKS,
4952
if parsedToken.Valid {
5053
claims, ok := parsedToken.Claims.(jwt.MapClaims)
5154
if !ok {
55+
supertokens.LogDebugMessage("GetInfoFromAccessToken: Returning TryRefreshTokenError because access token claims are invalid")
5256
return nil, sterrors.TryRefreshTokenError{
5357
Msg: "Invalid JWT claims",
5458
}
@@ -81,6 +85,7 @@ func GetInfoFromAccessToken(jwtInfo sessmodels.ParsedJWTInfo, jwks keyfunc.JWKS,
8185
}
8286

8387
if parseErr != nil {
88+
supertokens.LogDebugMessage(fmt.Sprintf("GetInfoFromAccessToken: Returning TryRefreshTokenError because access token parsing failed - %s", parseErr))
8489
return nil, sterrors.TryRefreshTokenError{
8590
Msg: parseErr.Error(),
8691
}
@@ -89,6 +94,7 @@ func GetInfoFromAccessToken(jwtInfo sessmodels.ParsedJWTInfo, jwks keyfunc.JWKS,
8994
if parsedToken.Valid {
9095
claims, ok := parsedToken.Claims.(jwt.MapClaims)
9196
if !ok {
97+
supertokens.LogDebugMessage("GetInfoFromAccessToken: Returning TryRefreshTokenError because access token claims are invalid")
9298
return nil, sterrors.TryRefreshTokenError{
9399
Msg: "Invalid JWT claims",
94100
}
@@ -107,13 +113,15 @@ func GetInfoFromAccessToken(jwtInfo sessmodels.ParsedJWTInfo, jwks keyfunc.JWKS,
107113
}
108114

109115
if payload == nil {
116+
supertokens.LogDebugMessage("GetInfoFromAccessToken: Returning TryRefreshTokenError because access token JWT has no payload")
110117
return nil, sterrors.TryRefreshTokenError{
111118
Msg: "Invalid JWT",
112119
}
113120
}
114121

115122
err := ValidateAccessTokenStructure(payload, jwtInfo.Version)
116123
if err != nil {
124+
supertokens.LogDebugMessage("GetInfoFromAccessToken: Returning TryRefreshTokenError because ValidateAccessTokenStructure returned an error")
117125
return nil, sterrors.TryRefreshTokenError{
118126
Msg: err.Error(),
119127
}
@@ -142,12 +150,14 @@ func GetInfoFromAccessToken(jwtInfo sessmodels.ParsedJWTInfo, jwks keyfunc.JWKS,
142150
antiCsrfToken := sanitizeStringInput(payload["antiCsrfToken"])
143151

144152
if antiCsrfToken == nil && doAntiCsrfCheck {
153+
supertokens.LogDebugMessage("GetInfoFromAccessToken: Returning TryRefreshTokenError because access does not contain the anti-csrf token.")
145154
return nil, sterrors.TryRefreshTokenError{
146155
Msg: "Access token does not contain the anti-csrf token.",
147156
}
148157
}
149158

150159
if expiryTime < GetCurrTimeInMS() {
160+
supertokens.LogDebugMessage("GetInfoFromAccessToken: Returning TryRefreshTokenError because access is expired")
151161
return nil, sterrors.TryRefreshTokenError{
152162
Msg: "Access token expired",
153163
}
@@ -169,41 +179,55 @@ func ValidateAccessTokenStructure(payload map[string]interface{}, version int) e
169179
err := errors.New("Access token does not contain all the information. Maybe the structure has changed?")
170180

171181
if version >= 3 {
182+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: Access token is using version >= 3")
172183
if _, ok := payload["sessionHandle"].(string); !ok {
184+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: sessionHandle not found in JWT payload")
173185
return err
174186
}
175187
if _, ok := payload["sub"].(string); !ok {
188+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: sub claim not found in JWT payload")
176189
return err
177190
}
178191
if _, ok := payload["refreshTokenHash1"].(string); !ok {
192+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: refreshTokenHash1 not found in JWT payload")
179193
return err
180194
}
181195
if _, ok := payload["exp"].(float64); !ok {
196+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: exp claim not found in JWT payload")
182197
return err
183198
}
184199
if _, ok := payload["iat"].(float64); !ok {
200+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: iat claim not found in JWT payload")
185201
return err
186202
}
187203
} else {
204+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: Access token is using version < 3")
188205
if _, ok := payload["sessionHandle"].(string); !ok {
206+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: sessionHandle not found in JWT payload")
189207
return err
190208
}
191209
if _, ok := payload["userId"].(string); !ok {
210+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: userId not found in JWT payload")
192211
return err
193212
}
194213
if _, ok := payload["refreshTokenHash1"].(string); !ok {
214+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: refreshTokenHash1 not found in JWT payload")
195215
return err
196216
}
197217
if payload["userData"] == nil {
218+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: userData not found in JWT payload")
198219
return err
199220
}
200221
if _, ok := payload["userData"].(map[string]interface{}); !ok {
222+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: userData is invalid in JWT payload")
201223
return err
202224
}
203225
if _, ok := payload["expiryTime"].(float64); !ok {
226+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: expiryTime not found in JWT payload")
204227
return err
205228
}
206229
if _, ok := payload["timeCreated"].(float64); !ok {
230+
supertokens.LogDebugMessage("ValidateAccessTokenStructure: timeCreated not found in JWT payload")
207231
return err
208232
}
209233
}

recipe/session/session.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package session
1717

1818
import (
19+
"fmt"
1920
"reflect"
2021

2122
"github.com/supertokens/supertokens-golang/recipe/session/claims"
@@ -90,6 +91,7 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
9091
return nil, err
9192
}
9293
if sessionInformation == nil {
94+
supertokens.LogDebugMessage("GetSessionDataInDatabaseWithContext: Returning UnauthorizedError because session does not exist anymore")
9395
return nil, errors.UnauthorizedError{Msg: "session does not exist anymore"}
9496
}
9597
return sessionInformation.SessionDataInDatabase, nil
@@ -101,6 +103,7 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
101103
return err
102104
}
103105
if !updated {
106+
supertokens.LogDebugMessage("UpdateSessionDataInDatabaseWithContext: Returning UnauthorizedError because session does not exist anymore")
104107
return errors.UnauthorizedError{Msg: "session does not exist anymore"}
105108
}
106109
return nil
@@ -112,6 +115,7 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
112115
return 0, err
113116
}
114117
if sessionInformation == nil {
118+
supertokens.LogDebugMessage("GetTimeCreatedWithContext: Returning UnauthorizedError because session does not exist anymore")
115119
return 0, errors.UnauthorizedError{Msg: "session does not exist anymore"}
116120
}
117121
return sessionInformation.TimeCreated, nil
@@ -123,6 +127,7 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
123127
return 0, err
124128
}
125129
if sessionInformation == nil {
130+
supertokens.LogDebugMessage("GetExpiryWithContext: Returning UnauthorizedError because session does not exist anymore")
126131
return 0, errors.UnauthorizedError{Msg: "session does not exist anymore"}
127132
}
128133
return sessionInformation.Expiry, nil
@@ -160,6 +165,7 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
160165
response, err := regenerateAccessTokenHelper(*querier, &accessTokenPayload, sessionContainer.GetAccessToken())
161166

162167
if err != nil {
168+
supertokens.LogDebugMessage(fmt.Sprintf("MergeIntoAccessTokenPayloadWithContext: Returning UnauthorizedError because we could not regenerate the session - %s", err))
163169
return errors.UnauthorizedError{
164170
Msg: errors.UnauthorizedErrorStr,
165171
}

recipe/session/sessionFunctions.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package session
1818
import (
1919
"encoding/json"
2020
defaultErrors "errors"
21+
"fmt"
2122
"strings"
2223

2324
"github.com/supertokens/supertokens-golang/recipe/session/errors"
@@ -63,6 +64,7 @@ func getSessionHelper(config sessmodels.TypeNormalisedInput, querier supertokens
6364
var err error = nil
6465
combinedJwks, jwksError := sessmodels.GetCombinedJWKS()
6566
if jwksError != nil {
67+
supertokens.LogDebugMessage(fmt.Sprintf("getSessionHelper: Returning TryRefreshTokenError because there was an error fetching JWKs - %s", jwksError))
6668
if !defaultErrors.As(jwksError, &errors.TryRefreshTokenError{}) {
6769
return sessmodels.GetSessionResponse{}, jwksError
6870
}
@@ -71,6 +73,7 @@ func getSessionHelper(config sessmodels.TypeNormalisedInput, querier supertokens
7173
accessTokenInfo, err = GetInfoFromAccessToken(parsedAccessToken, *combinedJwks, config.AntiCsrf == AntiCSRF_VIA_TOKEN && doAntiCsrfCheck)
7274
if err != nil {
7375
if !defaultErrors.As(err, &errors.TryRefreshTokenError{}) {
76+
supertokens.LogDebugMessage("getSessionHelper: Returning TryRefreshTokenError because GetInfoFromAccessToken returned an error")
7477
return sessmodels.GetSessionResponse{}, err
7578
}
7679

recipe/session/sessionRequestFunctions.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ func CreateNewSessionInRequest(req *http.Request, res http.ResponseWriter, confi
117117
func GetSessionFromRequest(req *http.Request, res http.ResponseWriter, config sessmodels.TypeNormalisedInput, options *sessmodels.VerifySessionOptions, recipeImpl sessmodels.RecipeInterface, userContext supertokens.UserContext) (sessmodels.SessionContainer, error) {
118118
idRefreshToken := GetCookieValue(req, legacyIdRefreshTokenCookieName)
119119
if idRefreshToken != nil {
120+
supertokens.LogDebugMessage("GetSessionFromRequest: Returning TryRefreshTokenError because the request is using a legacy session and should be refreshed")
120121
return nil, errors.TryRefreshTokenError{
121122
Msg: "using legacy session, please call the refresh API",
122123
}
@@ -350,6 +351,10 @@ func RefreshSessionInRequest(req *http.Request, res http.ResponseWriter, config
350351
}
351352
}
352353

354+
if isUnauthorisedErr {
355+
supertokens.LogDebugMessage("RefreshSessionInRequest: Returning UnauthorizedError because RefreshSession returned an error")
356+
}
357+
353358
return nil, err
354359
}
355360

supertokens/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const (
2121
)
2222

2323
// VERSION current version of the lib
24-
const VERSION = "0.12.2"
24+
const VERSION = "0.12.3"
2525

2626
var (
2727
cdiSupported = []string{"2.21"}

0 commit comments

Comments
 (0)