@@ -488,7 +488,7 @@ public async Task<ResetPasswordForEmailState> ResetPasswordForEmail(ResetPasswor
488488
489489 await RefreshToken ( ) ;
490490
491- var user = await _api . GetUser ( CurrentSession . AccessToken ! ) ;
491+ var user = await _api . GetUser ( CurrentSession . AccessToken ) ;
492492 CurrentSession . User = user ;
493493
494494 return CurrentSession ;
@@ -518,14 +518,18 @@ public async Task<Session> SetSession(string accessToken, string refreshToken, b
518518 NotifyAuthStateChange ( SignedIn ) ;
519519 return CurrentSession ;
520520 }
521-
521+
522+ var iat = payload . IssuedAt ;
523+ var exp = payload . ValidTo ;
524+ var expiresIn = ( long ) ( exp - iat ) . TotalSeconds ;
525+
522526 CurrentSession = new Session
523527 {
524528 AccessToken = accessToken ,
525529 RefreshToken = refreshToken ,
526530 TokenType = "bearer" ,
527- ExpiresIn = payload . Expiration ! . Value ,
528- User = await _api . GetUser ( accessToken )
531+ ExpiresIn = expiresIn ,
532+ User = await _api . GetUser ( accessToken ) ,
529533 } ;
530534
531535 NotifyAuthStateChange ( SignedIn ) ;
@@ -574,7 +578,7 @@ public async Task<Session> SetSession(string accessToken, string refreshToken, b
574578 ExpiresIn = long . Parse ( expiresIn ) ,
575579 RefreshToken = refreshToken ,
576580 TokenType = tokenType ,
577- User = user
581+ User = user ,
578582 } ;
579583
580584 if ( storeSession )
@@ -595,14 +599,6 @@ public async Task<Session> SetSession(string accessToken, string refreshToken, b
595599 if ( CurrentSession == null )
596600 return null ;
597601
598- // Check to see if the session has expired. If so go ahead and destroy it.
599- if ( CurrentSession != null && CurrentSession . Expired ( ) )
600- {
601- _debugNotification ? . Log ( $ "Loaded session has expired") ;
602- DestroySession ( ) ;
603- return null ;
604- }
605-
606602 // If we aren't online, we can't refresh the token
607603 if ( ! Online )
608604 {
@@ -691,16 +687,28 @@ private void DestroySession()
691687 /// <inheritdoc />
692688 public async Task RefreshToken ( string accessToken , string refreshToken )
693689 {
690+ if ( ! Online )
691+ throw new GotrueException ( "Only supported when online" , Offline ) ;
692+
694693 if ( string . IsNullOrEmpty ( accessToken ) || string . IsNullOrEmpty ( refreshToken ) )
695694 throw new GotrueException ( "No token provided" , NoSessionFound ) ;
696695
697- var result = await _api . RefreshAccessToken ( accessToken , refreshToken ) ;
698-
699- if ( result == null || string . IsNullOrEmpty ( result . AccessToken ) )
700- throw new GotrueException ( "Could not refresh token from provided session." , NoSessionFound ) ;
696+ try
697+ {
698+ var result = await _api . RefreshAccessToken ( accessToken , refreshToken ) ;
701699
702- CurrentSession = result ;
703- NotifyAuthStateChange ( TokenRefreshed ) ;
700+ if ( result == null || string . IsNullOrEmpty ( result . AccessToken ) )
701+ throw new GotrueException ( "Could not refresh token from provided session." , NoSessionFound ) ;
702+
703+ CurrentSession = result ;
704+ NotifyAuthStateChange ( TokenRefreshed ) ;
705+ }
706+ catch ( GotrueException ex ) when ( ex . Reason is InvalidRefreshToken )
707+ {
708+ DestroySession ( ) ;
709+ NotifyAuthStateChange ( SignedOut ) ;
710+ throw ;
711+ }
704712 }
705713
706714 /// <inheritdoc />
@@ -712,17 +720,22 @@ public async Task RefreshToken()
712720 if ( CurrentSession == null || string . IsNullOrEmpty ( CurrentSession ? . AccessToken ) || string . IsNullOrEmpty ( CurrentSession ? . RefreshToken ) )
713721 throw new GotrueException ( "No current session." , NoSessionFound ) ;
714722
715- if ( CurrentSession ! . Expired ( ) )
716- throw new GotrueException ( "Session expired" , ExpiredRefreshToken ) ;
717-
718- var result = await _api . RefreshAccessToken ( CurrentSession . AccessToken ! , CurrentSession . RefreshToken ! ) ;
719-
720- if ( result == null || string . IsNullOrEmpty ( result . AccessToken ) )
721- throw new GotrueException ( "Could not refresh token from provided session." , NoSessionFound ) ;
723+ try
724+ {
725+ var result = await _api . RefreshAccessToken ( CurrentSession . AccessToken ! , CurrentSession . RefreshToken ! ) ;
726+ if ( result == null || string . IsNullOrEmpty ( result . AccessToken ) )
727+ throw new GotrueException ( "Could not refresh token from provided session." , NoSessionFound ) ;
722728
723- CurrentSession = result ;
729+ CurrentSession = result ;
724730
725- NotifyAuthStateChange ( TokenRefreshed ) ;
731+ NotifyAuthStateChange ( TokenRefreshed ) ;
732+ }
733+ catch ( GotrueException ex ) when ( ex . Reason is InvalidRefreshToken )
734+ {
735+ DestroySession ( ) ;
736+ NotifyAuthStateChange ( SignedOut ) ;
737+ throw ;
738+ }
726739 }
727740
728741
@@ -791,7 +804,7 @@ public void Shutdown()
791804
792805 if ( result == null || string . IsNullOrEmpty ( result . AccessToken ) )
793806 throw new GotrueException ( "Could not verify MFA." , MfaChallengeUnverified ) ;
794-
807+
795808 var session = new Session
796809 {
797810 AccessToken = result . AccessToken ,
@@ -835,14 +848,14 @@ public void Shutdown()
835848
836849 if ( result == null || string . IsNullOrEmpty ( result . AccessToken ) )
837850 throw new GotrueException ( "Could not verify MFA." , MfaChallengeUnverified ) ;
838-
851+
839852 var session = new Session
840853 {
841854 AccessToken = result . AccessToken ,
842855 RefreshToken = result . RefreshToken ,
843856 TokenType = "bearer" ,
844857 ExpiresIn = result . ExpiresIn ,
845- User = result . User
858+ User = result . User ,
846859 } ;
847860
848861 UpdateSession ( session ) ;
0 commit comments