Skip to content

Commit 38fea8f

Browse files
authored
feat: ability to skip logging out of auth0 in the browser (#76)
1 parent 9d55714 commit 38fea8f

File tree

4 files changed

+81
-53
lines changed

4 files changed

+81
-53
lines changed

Source/Immutable/Private/Immutable/Actions/ImtblPassportLogoutAsyncAction.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
#include "Immutable/ImmutableSubsystem.h"
77
#include "Immutable/Misc/ImtblLogging.h"
88

9-
UImtblPassportLogoutAsyncAction* UImtblPassportLogoutAsyncAction::Logout(UObject* WorldContextObject)
9+
UImtblPassportLogoutAsyncAction* UImtblPassportLogoutAsyncAction::Logout(UObject* WorldContextObject, bool DoHardLogout)
1010
{
1111
UImtblPassportLogoutAsyncAction* PassportInitBlueprintNode = NewObject<UImtblPassportLogoutAsyncAction>();
1212

1313
PassportInitBlueprintNode->WorldContextObject = WorldContextObject;
14+
PassportInitBlueprintNode->bDoHardLogout = DoHardLogout;
1415

1516
return PassportInitBlueprintNode;
1617
}
@@ -19,21 +20,22 @@ void UImtblPassportLogoutAsyncAction::Activate()
1920
{
2021
if (!WorldContextObject || !WorldContextObject->GetWorld())
2122
{
22-
FString Err = "Logout failed due to missing world or world context object.";
23-
IMTBL_WARN("%s", *Err)
24-
OnFailure.Broadcast(Err);
23+
const FString ErrorMessage = "Logout failed due to missing world or world context object.";
24+
25+
IMTBL_WARN("%s", *ErrorMessage)
26+
OnFailure.Broadcast(ErrorMessage);
27+
2528
return;
2629
}
2730

28-
GetSubsystem()->WhenReady(this, &UImtblPassportLogoutAsyncAction::DoLogout); //, /* timoutSec */ 15.0f);
31+
GetSubsystem()->WhenReady(this, &UImtblPassportLogoutAsyncAction::DoLogout);
2932
}
3033

3134
void UImtblPassportLogoutAsyncAction::DoLogout(TWeakObjectPtr<UImtblJSConnector> JSConnector)
3235
{
33-
// Get Passport
3436
auto Passport = GetSubsystem()->GetPassport();
35-
// Run Logout
36-
Passport->Logout(UImmutablePassport::FImtblPassportResponseDelegate::CreateUObject(this, &UImtblPassportLogoutAsyncAction::OnLogoutResponse));
37+
38+
Passport->Logout(bDoHardLogout, UImmutablePassport::FImtblPassportResponseDelegate::CreateUObject(this, &UImtblPassportLogoutAsyncAction::OnLogoutResponse));
3739
}
3840

3941
void UImtblPassportLogoutAsyncAction::OnLogoutResponse(FImmutablePassportResult Result) const

Source/Immutable/Private/Immutable/ImmutablePassport.cpp

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void UImmutablePassport::ConnectPKCE(bool IsConnectImx, const FImtblPassportResp
174174
}
175175
#endif
176176

177-
void UImmutablePassport::Logout(const FImtblPassportResponseDelegate& ResponseDelegate)
177+
void UImmutablePassport::Logout(bool DoHardLogout, const FImtblPassportResponseDelegate& ResponseDelegate)
178178
{
179179
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
180180
if (IsStateFlagsSet(IPS_PKCE) || bIsPrevConnectedViaPKCEFlow)
@@ -184,6 +184,10 @@ void UImmutablePassport::Logout(const FImtblPassportResponseDelegate& ResponseDe
184184
#endif
185185
if (IsStateFlagsSet(IPS_CONNECTED))
186186
{
187+
if (DoHardLogout)
188+
{
189+
SetStateFlags(IPS_HARDLOGOUT);
190+
}
187191
CallJS(ImmutablePassportAction::Logout, TEXT(""), ResponseDelegate, FImtblJSResponseDelegate::CreateUObject(this, &UImmutablePassport::OnLogoutResponse));
188192
}
189193
else
@@ -428,60 +432,79 @@ void UImmutablePassport::OnInitDeviceFlowResponse(FImtblJSResponse Response)
428432

429433
void UImmutablePassport::OnLogoutResponse(FImtblJSResponse Response)
430434
{
431-
if (auto ResponseDelegate = GetResponseDelegate(Response))
435+
auto ResponseDelegate = GetResponseDelegate(Response);
436+
437+
if (!ResponseDelegate)
432438
{
433-
if (Response.success)
434-
{
435-
FString Url;
436-
FString Err;
439+
return;
440+
}
437441

438-
Response.JsonObject->TryGetStringField(TEXT("result"), Url);
439-
if (!Url.IsEmpty())
440-
{
442+
FString Message;
443+
444+
if (!Response.success)
445+
{
446+
Message = Response.Error.IsSet() ? Response.Error->ToString() : Response.JsonObject->GetStringField(TEXT("error"));
447+
448+
IMTBL_ERR("%s", *Message)
449+
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{ Response.success, Message, Response });
450+
451+
return;
452+
}
453+
454+
if (!IsStateFlagsSet(IPS_HARDLOGOUT))
455+
{
456+
Message = "Logged out without clearing browser session";
457+
458+
IMTBL_LOG("%s", *Message)
459+
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{ true, Message });
460+
461+
return;
462+
}
463+
464+
FString Url;
465+
FString ErrorMessage;
466+
467+
ResetStateFlags(IPS_HARDLOGOUT);
468+
Response.JsonObject->TryGetStringField(TEXT("result"), Url);
469+
if (!Url.IsEmpty())
470+
{
441471
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
442-
if (IsStateFlagsSet(IPS_PKCE) || bIsPrevConnectedViaPKCEFlow)
443-
{
444-
OnHandleDeepLink = FImtblPassportHandleDeepLinkDelegate::CreateUObject(this, &UImmutablePassport::OnDeepLinkActivated);
472+
if (IsStateFlagsSet(IPS_PKCE) || bIsPrevConnectedViaPKCEFlow)
473+
{
474+
OnHandleDeepLink = FImtblPassportHandleDeepLinkDelegate::CreateUObject(this, &UImmutablePassport::OnDeepLinkActivated);
445475
#if PLATFORM_ANDROID
446-
LaunchAndroidUrl(Url);
476+
LaunchAndroidUrl(Url);
447477
#elif PLATFORM_IOS
448-
[[ImmutableIOS instance] launchUrl:TCHAR_TO_ANSI(*Url)];
478+
[[ImmutableIOS instance] launchUrl:TCHAR_TO_ANSI(*Url)];
449479
#elif PLATFORM_MAC
450-
[[ImmutableMac instance] launchUrl:TCHAR_TO_ANSI(*Url) forRedirectUri:TCHAR_TO_ANSI(*InitData.logoutRedirectUri)];
451-
#endif
452-
}
453-
else
454-
{
455-
#endif
456-
FPlatformProcess::LaunchURL(*Url, nullptr, &Err);
457-
if (Err.Len())
458-
{
459-
FString Msg = "Failed to connect to Browser: " + Err;
460-
IMTBL_ERR("%s", *Msg);
461-
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{false, Msg, Response});
462-
return;
463-
}
464-
IMTBL_LOG("Logged out.")
465-
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{Response.success, "Logged out"});
466-
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
467-
}
480+
[[ImmutableMac instance] launchUrl:TCHAR_TO_ANSI(*Url) forRedirectUri:TCHAR_TO_ANSI(*InitData.logoutRedirectUri)];
468481
#endif
469-
}
470-
else
471-
{
472-
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{false, "Logout Url is empty", Response});
473-
}
474-
ResetStateFlags(IPS_CONNECTED);
475482
}
476483
else
477484
{
478-
FString Msg = Response.Error.IsSet() ? Response.Error->ToString() : Response.JsonObject->GetStringField(TEXT("error"));
479-
480-
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{Response.success, Msg, Response});
485+
#endif
486+
FPlatformProcess::LaunchURL(*Url, nullptr, &ErrorMessage);
487+
if (ErrorMessage.Len())
488+
{
489+
Message = "Failed to connect to Browser: " + ErrorMessage;
490+
491+
IMTBL_ERR("%s", *Message);
492+
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{ false, Message, Response });
481493

482-
IMTBL_ERR("Error logging out.")
494+
return;
495+
}
496+
Message = "Logged out";
497+
IMTBL_LOG("%s", *Message)
498+
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{ Response.success, Message });
499+
#if PLATFORM_ANDROID | PLATFORM_IOS | PLATFORM_MAC
483500
}
501+
#endif
502+
}
503+
else
504+
{
505+
ResponseDelegate->ExecuteIfBound(FImmutablePassportResult{false, "Logout Url is empty", Response});
484506
}
507+
ResetStateFlags(IPS_CONNECTED);
485508
}
486509

487510
void UImmutablePassport::OnConnectSilentResponse(FImtblJSResponse Response)

Source/Immutable/Public/Immutable/Actions/ImtblPassportLogoutAsyncAction.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class IMMUTABLE_API UImtblPassportLogoutAsyncAction : public UImtblBlueprintAsyn
1818

1919
public:
2020
UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject", BlueprintInternalUseOnly = "true"), Category = "Immutable")
21-
static UImtblPassportLogoutAsyncAction* Logout(UObject* WorldContextObject);
21+
static UImtblPassportLogoutAsyncAction* Logout(UObject* WorldContextObject, bool DoHardLogout = true);
2222

2323
virtual void Activate() override;
2424

@@ -27,6 +27,8 @@ class IMMUTABLE_API UImtblPassportLogoutAsyncAction : public UImtblBlueprintAsyn
2727
void OnLogoutResponse(FImmutablePassportResult Result) const;
2828

2929
private:
30+
bool bDoHardLogout = true;
31+
3032
UPROPERTY(BlueprintAssignable)
3133
FPassportLogoutOutPin OnSuccess;
3234
UPROPERTY(BlueprintAssignable)

Source/Immutable/Public/Immutable/ImmutablePassport.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class IMMUTABLE_API UImmutablePassport : public UObject
6969
void ConnectPKCE(bool IsConnectImx, const FImtblPassportResponseDelegate& ResponseDelegate);
7070
#endif
7171

72-
void Logout(const FImtblPassportResponseDelegate& ResponseDelegate);
72+
void Logout(bool DoHardLogout, const FImtblPassportResponseDelegate& ResponseDelegate);
7373

7474
/**
7575
* Initializes the zkEVM provider.
@@ -239,7 +239,8 @@ class IMMUTABLE_API UImmutablePassport : public UObject
239239
IPS_IMX = 1 << 2,
240240
IPS_PKCE = 1 << 3,
241241
IPS_COMPLETING_PKCE = 1 << 4,
242-
IPS_INITIALIZED = 1 << 5
242+
IPS_INITIALIZED = 1 << 5,
243+
IPS_HARDLOGOUT = 1 << 6
243244
};
244245

245246
uint8 StateFlags = IPS_NONE;

0 commit comments

Comments
 (0)