E-mail
This method is used to easily allow users to authenticate with AcceleratXR via their registered e-mail address. It does not require a password be stored on the account. For that it is considered a password-less authentication method. This method also has the benefit of bypassing any configured multi-factor authentication settings with the account, since it effectively uses a time-based one-time password to function internally.
A user submits an authentication request to the /auth/email/<email>
endpoint. The system then sends a message
to the e-mail provided (assuming it’s registered) with a time-based one-time password code embedded in the body
of the message.
The following example shows the initial request to receive the totp code via e-mail.
CoreSDK->LoginEmail(_XPLATSTR("email")).then([](pplx::task<void> task)
{
try
{
// Force the exception to be re-thrown if an error occurred.
task.get();
}
catch (const axr::sdk::Exception& e)
{
// Handle error here
}
});
try
{
await CoreSDK.LoginEmail("email");
}
catch (Exception error)
{
// Handle error here
}
try
{
await CoreSDK.loginEmail("email");
}
catch (error: any)
{
// Handle error here
}
try
{
AXRCoreSDK SDK = AXRCoreSDK.GetInstance();
await SDK.Instance.LoginEmail("email");
}
catch (Exception error)
{
Debug.LogError("Failed e-mail login. Error=" + error.Message);
}
const IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());
check(OnlineSub != nullptr);
const IOnlineIdentityPtr IdentityInterface = OnlineSub->GetIdentityInterface();
check(IdentityInterface.IsValid());
FDelegateHandle LoginDelegateHandler;
auto LoginDelegate = FOnLoginCompleteDelegate::CreateLambda([=](int32 InLocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error)
{
if (Error.Len() > 0)
{
// Handle error here
}
IdentityInterface->ClearOnLoginCompleteDelegate_Handle(InLocalUserNum, LoginDelegateHandler);
});
LoginDelegateHandler = IdentityInterface->AddOnLoginCompleteDelegate_Handle(0, LoginDelegate);
FOnlineAccountCredentials creds;
creds.Type = ELoginMethods::ToString(ELoginMethods::Email);
creds.Id = TEXT("username");
IdentityInterface->Login(0, creds);
GET /auth/email/<email> HTTP/1.1
Once the code is received the user then submits the provided code to the backend to retrieve the final access token.
CoreSDK->LoginEmail(_XPLATSTR("email"), _XPLATSTR("code")).then([](pplx::task<void> task)
{
try
{
// Force the exception to be re-thrown if an error occurred.
task.get();
}
catch (const axr::sdk::Exception& e)
{
// Handle error here
}
});
try
{
await CoreSDK.LoginEmail("email", "code");
}
catch (Exception error)
{
// Handle error here
}
try
{
await CoreSDK.loginEmail("email", "code");
}
catch (error: any)
{
// Handle error here
}
try
{
AXRCoreSDK SDK = AXRCoreSDK.GetInstance();
await SDK.Instance.LoginEmail("email", "code");
}
catch (Exception error)
{
Debug.LogError("Failed e-mail login. Error=" + error.Message);
}
const IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());
check(OnlineSub != nullptr);
const IOnlineIdentityPtr IdentityInterface = OnlineSub->GetIdentityInterface();
check(IdentityInterface.IsValid());
FDelegateHandle LoginDelegateHandler;
auto LoginDelegate = FOnLoginCompleteDelegate::CreateLambda([=](int32 InLocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error)
{
if (Error.Len() > 0)
{
// Handle error here
}
IdentityInterface->ClearOnLoginCompleteDelegate_Handle(InLocalUserNum, LoginDelegateHandler);
});
LoginDelegateHandler = IdentityInterface->AddOnLoginCompleteDelegate_Handle(0, LoginDelegate);
FOnlineAccountCredentials creds;
creds.Type = ELoginMethods::ToString(ELoginMethods::Email);
creds.Id = TEXT("username");
creds.Token = TEXT("code");
IdentityInterface->Login(0, creds);
POST /auth/email/<email> HTTP/1.1
Content-Type: application/json
Content-Length: ...
{
"code": <totp>
}