Skip to content

Commit a28b400

Browse files
authored
feat: refresh session with a writer and a given token (#698)
+ tests fixes descope/etc#14313
1 parent a795d7d commit a28b400

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

descope/internal/auth/auth.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,13 @@ func (auth *authenticationService) RefreshSessionWithToken(ctx context.Context,
426426
return auth.refreshSession(ctx, refreshToken, nil)
427427
}
428428

429+
func (auth *authenticationService) RefreshSessionWithTokenAndWriter(ctx context.Context, refreshToken string, w http.ResponseWriter) (bool, *descope.Token, error) {
430+
if refreshToken == "" {
431+
return false, nil, utils.NewInvalidArgumentError("refreshToken")
432+
}
433+
return auth.refreshSession(ctx, refreshToken, w)
434+
}
435+
429436
func (auth *authenticationService) refreshSession(ctx context.Context, refreshToken string, w http.ResponseWriter) (bool, *descope.Token, error) {
430437
token, err := auth.validateJWT(refreshToken)
431438
if err != nil {

descope/internal/auth/auth_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,24 @@ func TestRefreshSessionWithTokenInvalidInput(t *testing.T) {
388388
require.False(t, ok)
389389
}
390390

391+
func TestRefreshSessionWithTokenAndWriter(t *testing.T) {
392+
a, err := newTestAuth(nil, DoOk(nil))
393+
require.NoError(t, err)
394+
response := httptest.NewRecorder()
395+
ok, _, err := a.RefreshSessionWithTokenAndWriter(context.Background(), jwtRTokenValid, response)
396+
require.NoError(t, err)
397+
require.True(t, ok)
398+
strictCookies(t, response)
399+
}
400+
401+
func TestRefreshSessionWithTokenAndWriterInvalidInput(t *testing.T) {
402+
a, err := newTestAuth(nil, DoOk(nil))
403+
require.NoError(t, err)
404+
ok, _, err := a.RefreshSessionWithTokenAndWriter(context.Background(), "", nil)
405+
require.ErrorIs(t, err, descope.ErrInvalidArguments)
406+
require.False(t, ok)
407+
}
408+
391409
func TestRefreshSessionWithTokenNoPublicKey(t *testing.T) {
392410
a, err := newTestAuthConf(&AuthParams{ProjectID: "a"}, nil, DoOk(nil))
393411
require.NoError(t, err)

descope/sdk/auth.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,12 @@ type Authentication interface {
354354
// returns true upon success or false, the updated session token and an error upon failure.
355355
RefreshSessionWithToken(ctx context.Context, refreshToken string) (bool, *descope.Token, error)
356356

357+
// RefreshSessionWithTokenAndWriter - Use to refresh a session with a given refresh token and ResponseWriter.
358+
// Use the ResponseWriter (optional) to apply the cookies to the response automatically.
359+
// Alternatively use RefreshSessionWithRequest with the incoming request.
360+
// returns true upon success or false, the updated session token and an error upon failure.
361+
RefreshSessionWithTokenAndWriter(ctx context.Context, refreshToken string, w http.ResponseWriter) (bool, *descope.Token, error)
362+
357363
// ValidateAndRefreshSessionWithRequest - Use to validate a session of a given request.
358364
// Should be called before any private API call that requires authorization.
359365
// In case the request cookie can be renewed an automatic renewal is called and returns a new set of cookies to use.

descope/tests/mocks/auth/authenticationmock.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,11 @@ type MockSession struct {
654654
RefreshSessionResponseArray []*descope.Token
655655
RefreshSessionResponseCounter int
656656

657+
RefreshSessionWithTokenAndWriterAssert func(refreshToken string, w http.ResponseWriter)
658+
RefreshSessionWithTokenAndWriterError error
659+
RefreshSessionWithTokenAndWriterResponse *descope.Token
660+
RefreshSessionWithTokenAndWriterFailure bool
661+
657662
ExchangeAccessKeyAssert func(accessKey string, loginOptions *descope.AccessKeyLoginOptions)
658663
ExchangeAccessKeyError error
659664
ExchangeAccessKeyResponse *descope.Token
@@ -774,6 +779,18 @@ func (m *MockSession) RefreshSessionWithToken(_ context.Context, refreshToken st
774779
return !m.RefreshSessionResponseFailure, m.RefreshSessionResponse, m.RefreshSessionError
775780
}
776781

782+
func (m *MockSession) RefreshSessionWithTokenAndWriter(_ context.Context, refreshToken string, w http.ResponseWriter) (bool, *descope.Token, error) {
783+
if m.RefreshSessionWithTokenAndWriterFailure {
784+
return false, nil, m.RefreshSessionWithTokenAndWriterError
785+
}
786+
787+
if m.RefreshSessionWithTokenAndWriterAssert != nil {
788+
m.RefreshSessionWithTokenAndWriterAssert(refreshToken, w)
789+
}
790+
791+
return !m.RefreshSessionWithTokenAndWriterFailure, m.RefreshSessionWithTokenAndWriterResponse, m.RefreshSessionWithTokenAndWriterError
792+
}
793+
777794
func (m *MockSession) ValidateAndRefreshSessionWithRequest(r *http.Request, w http.ResponseWriter) (bool, *descope.Token, error) {
778795
if m.ValidateAndRefreshSessionAssert != nil {
779796
m.ValidateAndRefreshSessionAssert(r, w)

0 commit comments

Comments
 (0)