Skip to content

Commit 00c1a31

Browse files
Merge pull request #154 from supertokens/session-error-throwing-fix
fix: Session error throwing fix
2 parents 96ef13f + 9f53bcf commit 00c1a31

File tree

8 files changed

+88
-66
lines changed

8 files changed

+88
-66
lines changed

CHANGELOG.md

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

88
## [unreleased]
99

10+
### Breaking change:
11+
- Changes session recipe interfaces to not return an `UNAUTHORISED` error when the input is a sessionHandle: https://github.com/supertokens/backend/issues/83
12+
- `GetSessionInformation` now returns `nil` is the session does not exist
13+
- `UpdateSessionData` now returns `nil` if the input `sessionHandle` does not exist.
14+
- `UpdateAccessTokenPayload` now returns `false` if the input `sessionHandle` does not exist.
15+
- `RegenerateAccessToken` now returns `nil` if the input access token's `sessionHandle` does not exist.
16+
- The session container functions have not changed in behaviour and return errors if `sessionHandle` does not exist. This works on the current session.
17+
1018
### Fixes
1119
- Clears cookies when RevokeSession is called using the session container, even if the session did not exist from before: https://github.com/supertokens/supertokens-node/issues/343
1220

recipe/session/main.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ func GetSessionWithContext(req *http.Request, res http.ResponseWriter, options *
4646
return (*instance.RecipeImpl.GetSession)(req, res, options, userContext)
4747
}
4848

49-
func GetSessionInformationWithContext(sessionHandle string, userContext supertokens.UserContext) (sessmodels.SessionInformation, error) {
49+
func GetSessionInformationWithContext(sessionHandle string, userContext supertokens.UserContext) (*sessmodels.SessionInformation, error) {
5050
instance, err := getRecipeInstanceOrThrowError()
5151
if err != nil {
52-
return sessmodels.SessionInformation{}, err
52+
return nil, err
5353
}
5454
return (*instance.RecipeImpl.GetSessionInformation)(sessionHandle, userContext)
5555
}
@@ -94,18 +94,18 @@ func RevokeMultipleSessionsWithContext(sessionHandles []string, userContext supe
9494
return (*instance.RecipeImpl.RevokeMultipleSessions)(sessionHandles, userContext)
9595
}
9696

97-
func UpdateSessionDataWithContext(sessionHandle string, newSessionData map[string]interface{}, userContext supertokens.UserContext) error {
97+
func UpdateSessionDataWithContext(sessionHandle string, newSessionData map[string]interface{}, userContext supertokens.UserContext) (bool, error) {
9898
instance, err := getRecipeInstanceOrThrowError()
9999
if err != nil {
100-
return err
100+
return false, err
101101
}
102102
return (*instance.RecipeImpl.UpdateSessionData)(sessionHandle, newSessionData, userContext)
103103
}
104104

105-
func UpdateAccessTokenPayloadWithContext(sessionHandle string, newAccessTokenPayload map[string]interface{}, userContext supertokens.UserContext) error {
105+
func UpdateAccessTokenPayloadWithContext(sessionHandle string, newAccessTokenPayload map[string]interface{}, userContext supertokens.UserContext) (bool, error) {
106106
instance, err := getRecipeInstanceOrThrowError()
107107
if err != nil {
108-
return err
108+
return false, err
109109
}
110110
return (*instance.RecipeImpl.UpdateAccessTokenPayload)(sessionHandle, newAccessTokenPayload, userContext)
111111
}
@@ -160,10 +160,10 @@ func GetOpenIdDiscoveryConfigurationWithContext(userContext supertokens.UserCont
160160
return (*instance.OpenIdRecipe.RecipeImpl.GetOpenIdDiscoveryConfiguration)(userContext)
161161
}
162162

163-
func RegenerateAccessTokenWithContext(accessToken string, newAccessTokenPayload *map[string]interface{}, sessionHandle string, userContext supertokens.UserContext) (sessmodels.RegenerateAccessTokenResponse, error) {
163+
func RegenerateAccessTokenWithContext(accessToken string, newAccessTokenPayload *map[string]interface{}, sessionHandle string, userContext supertokens.UserContext) (*sessmodels.RegenerateAccessTokenResponse, error) {
164164
instance, err := getRecipeInstanceOrThrowError()
165165
if err != nil {
166-
return sessmodels.RegenerateAccessTokenResponse{}, err
166+
return nil, err
167167
}
168168
return (*instance.RecipeImpl.RegenerateAccessToken)(accessToken, newAccessTokenPayload, userContext)
169169
}
@@ -176,7 +176,7 @@ func GetSession(req *http.Request, res http.ResponseWriter, options *sessmodels.
176176
return GetSessionWithContext(req, res, options, &map[string]interface{}{})
177177
}
178178

179-
func GetSessionInformation(sessionHandle string) (sessmodels.SessionInformation, error) {
179+
func GetSessionInformation(sessionHandle string) (*sessmodels.SessionInformation, error) {
180180
return GetSessionInformationWithContext(sessionHandle, &map[string]interface{}{})
181181
}
182182

@@ -200,11 +200,11 @@ func RevokeMultipleSessions(sessionHandles []string) ([]string, error) {
200200
return RevokeMultipleSessionsWithContext(sessionHandles, &map[string]interface{}{})
201201
}
202202

203-
func UpdateSessionData(sessionHandle string, newSessionData map[string]interface{}) error {
203+
func UpdateSessionData(sessionHandle string, newSessionData map[string]interface{}) (bool, error) {
204204
return UpdateSessionDataWithContext(sessionHandle, newSessionData, &map[string]interface{}{})
205205
}
206206

207-
func UpdateAccessTokenPayload(sessionHandle string, newAccessTokenPayload map[string]interface{}) error {
207+
func UpdateAccessTokenPayload(sessionHandle string, newAccessTokenPayload map[string]interface{}) (bool, error) {
208208
return UpdateAccessTokenPayloadWithContext(sessionHandle, newAccessTokenPayload, &map[string]interface{}{})
209209
}
210210

@@ -220,6 +220,6 @@ func GetOpenIdDiscoveryConfiguration() (openidmodels.GetOpenIdDiscoveryConfigura
220220
return GetOpenIdDiscoveryConfigurationWithContext(&map[string]interface{}{})
221221
}
222222

223-
func RegenerateAccessToken(accessToken string, newAccessTokenPayload *map[string]interface{}, sessionHandle string) (sessmodels.RegenerateAccessTokenResponse, error) {
223+
func RegenerateAccessToken(accessToken string, newAccessTokenPayload *map[string]interface{}, sessionHandle string) (*sessmodels.RegenerateAccessTokenResponse, error) {
224224
return RegenerateAccessTokenWithContext(accessToken, newAccessTokenPayload, sessionHandle, &map[string]interface{}{})
225225
}

recipe/session/recipeImplementation.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func makeRecipeImplementation(querier supertokens.Querier, config sessmodels.Typ
111111
return &sessionContainer, nil
112112
}
113113

114-
getSessionInformation := func(sessionHandle string, userContext supertokens.UserContext) (sessmodels.SessionInformation, error) {
114+
getSessionInformation := func(sessionHandle string, userContext supertokens.UserContext) (*sessmodels.SessionInformation, error) {
115115
return getSessionInformationHelper(querier, sessionHandle)
116116
}
117117

@@ -165,11 +165,11 @@ func makeRecipeImplementation(querier supertokens.Querier, config sessmodels.Typ
165165
return revokeMultipleSessionsHelper(querier, sessionHandles)
166166
}
167167

168-
updateSessionData := func(sessionHandle string, newSessionData map[string]interface{}, userContext supertokens.UserContext) error {
168+
updateSessionData := func(sessionHandle string, newSessionData map[string]interface{}, userContext supertokens.UserContext) (bool, error) {
169169
return updateSessionDataHelper(querier, sessionHandle, newSessionData)
170170
}
171171

172-
updateAccessTokenPayload := func(sessionHandle string, newAccessTokenPayload map[string]interface{}, userContext supertokens.UserContext) error {
172+
updateAccessTokenPayload := func(sessionHandle string, newAccessTokenPayload map[string]interface{}, userContext supertokens.UserContext) (bool, error) {
173173
return updateAccessTokenPayloadHelper(querier, sessionHandle, newAccessTokenPayload)
174174
}
175175

@@ -189,7 +189,7 @@ func makeRecipeImplementation(querier supertokens.Querier, config sessmodels.Typ
189189
return recipeImplHandshakeInfo.RefreshTokenValidity, nil
190190
}
191191

192-
regenerateAccessToken := func(accessToken string, newAccessTokenPayload *map[string]interface{}, userContext supertokens.UserContext) (sessmodels.RegenerateAccessTokenResponse, error) {
192+
regenerateAccessToken := func(accessToken string, newAccessTokenPayload *map[string]interface{}, userContext supertokens.UserContext) (*sessmodels.RegenerateAccessTokenResponse, error) {
193193
return regenerateAccessTokenHelper(querier, newAccessTokenPayload, accessToken)
194194
}
195195

recipe/session/session.go

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

1818
import (
19-
defaultErrors "errors"
2019
"net/http"
2120
"reflect"
2221

@@ -59,22 +58,24 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
5958
getSessionDataWithContext := func(userContext supertokens.UserContext) (map[string]interface{}, error) {
6059
sessionInformation, err := (*session.recipeImpl.GetSessionInformation)(session.sessionHandle, userContext)
6160
if err != nil {
62-
if defaultErrors.As(err, &errors.UnauthorizedError{}) {
63-
clearSessionFromCookie(config, session.res)
64-
}
6561
return nil, err
6662
}
63+
if sessionInformation == nil {
64+
clearSessionFromCookie(config, session.res)
65+
return nil, errors.UnauthorizedError{Msg: "session does not exist anymore"}
66+
}
6767
return sessionInformation.SessionData, nil
6868
}
6969

7070
updateSessionDataWithContext := func(newSessionData map[string]interface{}, userContext supertokens.UserContext) error {
71-
err := (*session.recipeImpl.UpdateSessionData)(session.sessionHandle, newSessionData, userContext)
71+
updated, err := (*session.recipeImpl.UpdateSessionData)(session.sessionHandle, newSessionData, userContext)
7272
if err != nil {
73-
if defaultErrors.As(err, &errors.UnauthorizedError{}) {
74-
clearSessionFromCookie(config, session.res)
75-
}
7673
return err
7774
}
75+
if !updated {
76+
clearSessionFromCookie(config, session.res)
77+
return errors.UnauthorizedError{Msg: "session does not exist anymore"}
78+
}
7879
return nil
7980
}
8081

@@ -89,6 +90,11 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
8990
return err
9091
}
9192

93+
if resp == nil {
94+
clearSessionFromCookie(config, session.res)
95+
return errors.UnauthorizedError{Msg: "session does not exist anymore"}
96+
}
97+
9298
session.userDataInAccessToken = resp.Session.UserDataInAccessToken
9399

94100
if !reflect.DeepEqual(resp.AccessToken, sessmodels.CreateOrRefreshAPIResponseToken{}) {
@@ -102,22 +108,24 @@ func newSessionContainer(config sessmodels.TypeNormalisedInput, session *Session
102108
getTimeCreatedWithContext := func(userContext supertokens.UserContext) (uint64, error) {
103109
sessionInformation, err := (*session.recipeImpl.GetSessionInformation)(session.sessionHandle, userContext)
104110
if err != nil {
105-
if defaultErrors.As(err, &errors.UnauthorizedError{}) {
106-
clearSessionFromCookie(config, session.res)
107-
}
108111
return 0, err
109112
}
113+
if sessionInformation == nil {
114+
clearSessionFromCookie(config, session.res)
115+
return 0, errors.UnauthorizedError{Msg: "session does not exist anymore"}
116+
}
110117
return sessionInformation.TimeCreated, nil
111118
}
112119

113120
getExpiryWithContext := func(userContext supertokens.UserContext) (uint64, error) {
114121
sessionInformation, err := (*session.recipeImpl.GetSessionInformation)(session.sessionHandle, userContext)
115122
if err != nil {
116-
if defaultErrors.As(err, &errors.UnauthorizedError{}) {
117-
clearSessionFromCookie(config, session.res)
118-
}
119123
return 0, err
120124
}
125+
if sessionInformation == nil {
126+
clearSessionFromCookie(config, session.res)
127+
return 0, errors.UnauthorizedError{Msg: "session does not exist anymore"}
128+
}
121129
return sessionInformation.Expiry, nil
122130
}
123131

recipe/session/sessionFunctions.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,16 @@ func getSessionHelper(recipeImplHandshakeInfo *sessmodels.HandshakeInfo, config
182182
}
183183
}
184184

185-
func getSessionInformationHelper(querier supertokens.Querier, sessionHandle string) (sessmodels.SessionInformation, error) {
185+
func getSessionInformationHelper(querier supertokens.Querier, sessionHandle string) (*sessmodels.SessionInformation, error) {
186186
response, err := querier.SendGetRequest("/recipe/session",
187187
map[string]string{
188188
"sessionHandle": sessionHandle,
189189
})
190190
if err != nil {
191-
return sessmodels.SessionInformation{}, err
191+
return nil, err
192192
}
193193
if response["status"] == "OK" {
194-
return sessmodels.SessionInformation{
194+
return &sessmodels.SessionInformation{
195195
SessionHandle: response["sessionHandle"].(string),
196196
UserId: response["userId"].(string),
197197
SessionData: response["userDataInDatabase"].(map[string]interface{}),
@@ -200,7 +200,7 @@ func getSessionInformationHelper(querier supertokens.Querier, sessionHandle stri
200200
AccessTokenPayload: response["userDataInJWT"].(map[string]interface{}),
201201
}, nil
202202
}
203-
return sessmodels.SessionInformation{}, errors.UnauthorizedError{Msg: response["message"].(string)}
203+
return nil, nil
204204
}
205205

206206
func refreshSessionHelper(recipeImplHandshakeInfo *sessmodels.HandshakeInfo, config sessmodels.TypeNormalisedInput, querier supertokens.Querier, refreshToken string, antiCsrfToken *string, containsCustomHeader bool) (sessmodels.CreateOrRefreshAPIResponse, error) {
@@ -328,7 +328,7 @@ func revokeMultipleSessionsHelper(querier supertokens.Querier, sessionHandles []
328328
return result, nil
329329
}
330330

331-
func updateSessionDataHelper(querier supertokens.Querier, sessionHandle string, newSessionData map[string]interface{}) error {
331+
func updateSessionDataHelper(querier supertokens.Querier, sessionHandle string, newSessionData map[string]interface{}) (bool, error) {
332332
if newSessionData == nil {
333333
newSessionData = map[string]interface{}{}
334334
}
@@ -338,15 +338,15 @@ func updateSessionDataHelper(querier supertokens.Querier, sessionHandle string,
338338
"userDataInDatabase": newSessionData,
339339
})
340340
if err != nil {
341-
return err
341+
return false, err
342342
}
343343
if response["status"].(string) == errors.UnauthorizedErrorStr {
344-
return errors.UnauthorizedError{Msg: response["message"].(string)}
344+
return false, nil
345345
}
346-
return nil
346+
return true, nil
347347
}
348348

349-
func updateAccessTokenPayloadHelper(querier supertokens.Querier, sessionHandle string, newAccessTokenPayload map[string]interface{}) error {
349+
func updateAccessTokenPayloadHelper(querier supertokens.Querier, sessionHandle string, newAccessTokenPayload map[string]interface{}) (bool, error) {
350350
if newAccessTokenPayload == nil {
351351
newAccessTokenPayload = map[string]interface{}{}
352352
}
@@ -355,15 +355,15 @@ func updateAccessTokenPayloadHelper(querier supertokens.Querier, sessionHandle s
355355
"userDataInJWT": newAccessTokenPayload,
356356
})
357357
if err != nil {
358-
return err
358+
return false, err
359359
}
360360
if response["status"].(string) == errors.UnauthorizedErrorStr {
361-
return errors.UnauthorizedError{Msg: response["message"].(string)}
361+
return false, nil
362362
}
363-
return nil
363+
return true, nil
364364
}
365365

366-
func regenerateAccessTokenHelper(querier supertokens.Querier, newAccessTokenPayload *map[string]interface{}, accessToken string) (sessmodels.RegenerateAccessTokenResponse, error) {
366+
func regenerateAccessTokenHelper(querier supertokens.Querier, newAccessTokenPayload *map[string]interface{}, accessToken string) (*sessmodels.RegenerateAccessTokenResponse, error) {
367367
if newAccessTokenPayload == nil {
368368
newAccessTokenPayload = &map[string]interface{}{}
369369
}
@@ -372,19 +372,19 @@ func regenerateAccessTokenHelper(querier supertokens.Querier, newAccessTokenPayl
372372
"userDataInJWT": newAccessTokenPayload,
373373
})
374374
if err != nil {
375-
return sessmodels.RegenerateAccessTokenResponse{}, err
375+
return nil, err
376376
}
377377
if response["status"].(string) == errors.UnauthorizedErrorStr {
378-
return sessmodels.RegenerateAccessTokenResponse{}, errors.UnauthorizedError{Msg: response["message"].(string)}
378+
return nil, nil
379379
}
380380
responseByte, err := json.Marshal(response)
381381
if err != nil {
382-
return sessmodels.RegenerateAccessTokenResponse{}, err
382+
return nil, err
383383
}
384384
var resp sessmodels.RegenerateAccessTokenResponse
385385
err = json.Unmarshal(responseByte, &resp)
386386
if err != nil {
387-
return sessmodels.RegenerateAccessTokenResponse{}, err
387+
return nil, err
388388
}
389-
return resp, nil
389+
return &resp, nil
390390
}

recipe/session/session_test.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -470,13 +470,12 @@ func TestManipulatingSessionData(t *testing.T) {
470470

471471
//update session data with wrong session handle
472472

473-
err = UpdateSessionData("random", map[string]interface{}{
473+
sessionUpdated, err := UpdateSessionData("random", map[string]interface{}{
474474
"name": "Ronit",
475475
})
476476

477-
assert.Error(t, err)
478-
479-
assert.Equal(t, "Session does not exist.", err.Error())
477+
assert.NoError(t, err)
478+
assert.False(t, sessionUpdated)
480479
}
481480

482481
func TestNilValuesPassedForSessionData(t *testing.T) {
@@ -613,35 +612,38 @@ func TestManipulatingJWTpayload(t *testing.T) {
613612
t.Error(err.Error())
614613
}
615614

616-
err = UpdateAccessTokenPayload(sessionHandles[0], map[string]interface{}{
615+
tokenUpdated, err := UpdateAccessTokenPayload(sessionHandles[0], map[string]interface{}{
617616
"key": "value",
618617
})
619618

620619
assert.NoError(t, err)
620+
assert.True(t, tokenUpdated)
621621

622622
sessionInfo, err := GetSessionInformation(sessionHandles[0])
623623

624624
assert.NoError(t, err)
625625

626626
assert.Equal(t, "value", sessionInfo.AccessTokenPayload["key"])
627627

628-
err = UpdateAccessTokenPayload(sessionHandles[0], map[string]interface{}{
628+
tokenUpdated, err = UpdateAccessTokenPayload(sessionHandles[0], map[string]interface{}{
629629
"key": "value2",
630630
})
631631

632632
assert.NoError(t, err)
633+
assert.True(t, tokenUpdated)
633634

634635
sessionInfo1, err := GetSessionInformation(sessionHandles[0])
635636

636637
assert.NoError(t, err)
637638

638639
assert.Equal(t, "value2", sessionInfo1.AccessTokenPayload["key"])
639640

640-
err = UpdateAccessTokenPayload("random", map[string]interface{}{
641+
tokenUpdated, err = UpdateAccessTokenPayload("random", map[string]interface{}{
641642
"key": "value3",
642643
})
643644

644-
assert.Error(t, err)
645+
assert.NoError(t, err)
646+
assert.False(t, tokenUpdated)
645647
}
646648

647649
func TestWhenAntiCsrfIsDisabledFromSTcoreNotHavingThatInInputToVerifySessionIsFine(t *testing.T) {
@@ -950,8 +952,9 @@ func TestRevokedSessionThrowsErrorWhenCallingGetSessionBySessionHandle(t *testin
950952
assert.NoError(t, err)
951953
_, err = RevokeAllSessionsForUser("ronit")
952954
assert.NoError(t, err)
953-
_, err = GetSessionInformation(sessionHandlers[0])
954-
assert.Error(t, err)
955+
sessionInformation, err := GetSessionInformation(sessionHandlers[0])
956+
assert.Nil(t, sessionInformation)
957+
assert.NoError(t, err)
955958
}
956959

957960
func TestSignoutWorksAfterSessionDeletedOnBackend(t *testing.T) {

0 commit comments

Comments
 (0)