Skip to content

Commit afffe37

Browse files
authored
Merge pull request #175 from immutable/feat/hard-logout
[DX-2713] feat: ability to skip logging out of auth0 in the browser
2 parents 7d0a15d + 06cea50 commit afffe37

File tree

3 files changed

+67
-12
lines changed

3 files changed

+67
-12
lines changed

src/Packages/Passport/Runtime/Scripts/Private/PassportImpl.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -520,14 +520,17 @@ public async UniTask<string> GetLogoutUrl()
520520
}
521521
}
522522

523-
public async UniTask Logout()
523+
public async UniTask Logout(bool hardLogout = true)
524524
{
525525
try
526526
{
527527
SendAuthEvent(PassportAuthEvent.LoggingOut);
528528

529529
string logoutUrl = await GetLogoutUrl();
530-
OpenUrl(logoutUrl);
530+
if (hardLogout)
531+
{
532+
OpenUrl(logoutUrl);
533+
}
531534

532535
Track(PassportAnalytics.EventName.COMPLETE_LOGOUT, success: true);
533536
SendAuthEvent(PassportAuthEvent.LogoutSuccess);
@@ -544,15 +547,15 @@ public async UniTask Logout()
544547
}
545548
}
546549

547-
public UniTask LogoutPKCE()
550+
public UniTask LogoutPKCE(bool hardLogout = true)
548551
{
549552
try
550553
{
551554
SendAuthEvent(PassportAuthEvent.LoggingOutPKCE);
552555

553556
UniTaskCompletionSource<bool> task = new UniTaskCompletionSource<bool>();
554557
pkceCompletionSource = task;
555-
LaunchLogoutPKCEUrl();
558+
LaunchLogoutPKCEUrl(hardLogout);
556559
return task.Task;
557560
}
558561
catch (Exception ex)
@@ -579,15 +582,21 @@ private async void HandleLogoutPKCESuccess()
579582
pkceCompletionSource = null;
580583
}
581584

582-
private async void LaunchLogoutPKCEUrl()
585+
private async void LaunchLogoutPKCEUrl(bool hardLogout)
583586
{
584587
string logoutUrl = await GetLogoutUrl();
585-
588+
if (hardLogout)
589+
{
586590
#if UNITY_ANDROID && !UNITY_EDITOR
587-
LaunchAndroidUrl(logoutUrl);
591+
LaunchAndroidUrl(logoutUrl);
588592
#else
589-
communicationsManager.LaunchAuthURL(logoutUrl, logoutRedirectUri);
593+
communicationsManager.LaunchAuthURL(logoutUrl, logoutRedirectUri);
590594
#endif
595+
}
596+
else
597+
{
598+
HandleLogoutPKCESuccess();
599+
}
591600
}
592601

593602
public async UniTask<bool> HasCredentialsSaved()

src/Packages/Passport/Runtime/Scripts/Public/Passport.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,18 +199,20 @@ public async UniTask<string> GetAddress()
199199
/// Logs the user out of Passport and removes any stored credentials.
200200
/// Recommended to use when logging in using device auth flow - ConnectImx()
201201
/// </summary>
202-
public async UniTask Logout()
202+
/// <param name="hardLogout">If false, the user will not be logged out of Passport in the browser. The default is true.</param>
203+
public async UniTask Logout(bool hardLogout = true)
203204
{
204-
await GetPassportImpl().Logout();
205+
await GetPassportImpl().Logout(hardLogout);
205206
}
206207

207208
/// <summary>
208209
/// Logs the user out of Passport and removes any stored credentials.
209210
/// Recommended to use when logging in using PKCE flow - ConnectImxPKCE()
210211
/// </summary>
211-
public async UniTask LogoutPKCE()
212+
/// <param name="hardLogout">If false, the user will not be logged out of Passport in the browser. The default is true.</param>
213+
public async UniTask LogoutPKCE(bool hardLogout = true)
212214
{
213-
await GetPassportImpl().LogoutPKCE();
215+
await GetPassportImpl().LogoutPKCE(hardLogout);
214216
}
215217

216218
/// <summary>

src/Packages/Passport/Tests/Runtime/Scripts/PassportTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,50 @@ public async Task Login_Logout_Success()
126126
Assert.AreEqual(expectedEvents, authEvents);
127127
}
128128

129+
[Test]
130+
public async Task Login_Soft_Logout_Success()
131+
{
132+
var deviceConnectResponse = new DeviceConnectResponse
133+
{
134+
success = true,
135+
code = CODE,
136+
deviceCode = DEVICE_CODE,
137+
url = URL
138+
};
139+
communicationsManager.AddMockResponse(deviceConnectResponse);
140+
var confirmCodeResponse = new BrowserResponse
141+
{
142+
success = true
143+
};
144+
communicationsManager.AddMockResponse(confirmCodeResponse);
145+
var logoutResponse = new StringResponse
146+
{
147+
success = true,
148+
result = LOGOUT_URL
149+
};
150+
communicationsManager.AddMockResponse(logoutResponse);
151+
152+
// Login
153+
bool success = await passport.Login();
154+
Assert.True(success);
155+
156+
// Logout
157+
await passport.Logout(hardLogout: false);
158+
159+
Assert.AreEqual(1, urlsOpened.Count);
160+
Assert.AreEqual(URL, urlsOpened[0]);
161+
List<PassportAuthEvent> expectedEvents = new List<PassportAuthEvent>{
162+
PassportAuthEvent.LoggingIn,
163+
PassportAuthEvent.LoginOpeningBrowser,
164+
PassportAuthEvent.PendingBrowserLogin,
165+
PassportAuthEvent.LoginSuccess,
166+
PassportAuthEvent.LoggingOut,
167+
PassportAuthEvent.LogoutSuccess
168+
};
169+
Assert.AreEqual(expectedEvents.Count, authEvents.Count);
170+
Assert.AreEqual(expectedEvents, authEvents);
171+
}
172+
129173
[Test]
130174
public async Task Login_InitialiseDeviceCodeAuth_Failed()
131175
{

0 commit comments

Comments
 (0)