From 8a5d2865604a8d2bf693258d31c6ea9bca2a275d Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Wed, 7 Jul 2021 17:14:38 +0200 Subject: [PATCH] chore: WG login redirection and parameters parsing implemented --- .../Messages/RedirectFromWgLoginMessage.cs | 28 +++++++++++ .../Pages/Login.razor | 46 +++++++++++++++++++ .../Services/WargamingLoginService.cs | 24 ++++++++-- .../WotBlitzStatisticsPro.Blazor.csproj | 1 + 4 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 WotBlitzStatisticsPro.Blazor/Messages/RedirectFromWgLoginMessage.cs create mode 100644 WotBlitzStatisticsPro.Blazor/Pages/Login.razor diff --git a/WotBlitzStatisticsPro.Blazor/Messages/RedirectFromWgLoginMessage.cs b/WotBlitzStatisticsPro.Blazor/Messages/RedirectFromWgLoginMessage.cs new file mode 100644 index 0000000..5faffd3 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Messages/RedirectFromWgLoginMessage.cs @@ -0,0 +1,28 @@ +using MediatR; +using WotBlitzStatisticsPro.Blazor.GraphQl; + +namespace WotBlitzStatisticsPro.Blazor.Messages +{ + public class RedirectFromWgLoginMessage : INotification + { + public RealmType Realm { get; } + public string NickName { get; } + public long AccountId { get; } + public string AccessToken { get; } + public long ExpiresAt { get; } + + public RedirectFromWgLoginMessage( + RealmType realm, + string nickName, + long accountId, + string accessToken, + long expiresAt) + { + Realm = realm; + NickName = nickName; + AccountId = accountId; + AccessToken = accessToken; + ExpiresAt = expiresAt; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Pages/Login.razor b/WotBlitzStatisticsPro.Blazor/Pages/Login.razor new file mode 100644 index 0000000..1f2b37f --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Pages/Login.razor @@ -0,0 +1,46 @@ +@page "/login/{Realm}" +@using WotBlitzStatisticsPro.Blazor.Messages +@using MediatR +@using Microsoft.AspNetCore.WebUtilities +@inject NavigationManager NavigationManager +@inject IMediator Mediator +

Login

+ +

@realmValue | @accountId | @nickName | @accessToken | @expiresAt

+ + +@code { + + [Parameter] + public string Realm { get; set; } = "Asia"; + + string nickName; + long accountId; + string accessToken; + long expiresAt; + RealmType realmValue = RealmType.Asia; + + protected override async Task OnInitializedAsync() + { + var query = QueryHelpers.ParseQuery(NavigationManager.Uri); + if (query.ContainsKey("status") && + query.ContainsKey("access_token") && + query.ContainsKey("nickname") && + query.ContainsKey("account_id") && + query.ContainsKey("expires_at")) + { + string status = query["status"].FirstOrDefault(); + if (status == "ok") + { + nickName = query["nickname"].FirstOrDefault(); + accountId = Convert.ToInt64(query["account_id"].FirstOrDefault()); + accessToken = query["access_token"].FirstOrDefault(); + expiresAt = Convert.ToInt64(query["expires_at"].FirstOrDefault()); + Enum.TryParse(Realm, out realmValue); + + await Mediator.Publish(new RedirectFromWgLoginMessage(realmValue, nickName, accountId, accessToken, expiresAt)); + } + } + } + +} diff --git a/WotBlitzStatisticsPro.Blazor/Services/WargamingLoginService.cs b/WotBlitzStatisticsPro.Blazor/Services/WargamingLoginService.cs index cee10f0..9b70bb1 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/WargamingLoginService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/WargamingLoginService.cs @@ -2,6 +2,7 @@ using System.Threading; using System.Threading.Tasks; using MediatR; +using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Localization; using Radzen; using WotBlitzStatisticsPro.Blazor.Messages; @@ -9,20 +10,26 @@ using WotBlitzStatisticsPro.Blazor.Pages; namespace WotBlitzStatisticsPro.Blazor.Services { - public class WargamingLoginService: INotificationHandler, INotificationHandler + public class WargamingLoginService: + INotificationHandler, + INotificationHandler, + INotificationHandler { private readonly IGraphQlBackendService _graphQlBackendService; private readonly DialogService _dialogService; private readonly IStringLocalizer _localizer; + private readonly NavigationManager _navigationManager; public WargamingLoginService( IGraphQlBackendService graphQlBackendService, DialogService dialogService, - IStringLocalizer localizer) + IStringLocalizer localizer, + NavigationManager navigationManager) { _graphQlBackendService = graphQlBackendService; _dialogService = dialogService; _localizer = localizer; + _navigationManager = navigationManager; } public async Task Handle(LoginToWgMessage notification, CancellationToken cancellationToken) @@ -36,8 +43,17 @@ namespace WotBlitzStatisticsPro.Blazor.Services public async Task Handle(RedirectToWgLoginMessage notification, CancellationToken cancellationToken) { var url = await _graphQlBackendService.GetWgLoginUrl(notification.Realm); - // ToDo: take a look to redirect message in previous app reincarnation - url = $"{url}&redirect_uri=https://developers.wargaming.net/reference/all/wot/auth/login/"; + var baseUri = _navigationManager.BaseUri; + url = $"{url}&redirect_uri={baseUri}login/{notification.Realm}"; + + _navigationManager.NavigateTo(url); + } + + public Task Handle(RedirectFromWgLoginMessage notification, CancellationToken cancellationToken) + { + // ToDo: Store login info to local storage + // ToDo: Send OpenPlayerInfoMessage with isLoggedIn = true + return Task.CompletedTask; } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj b/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj index d8258e3..379276c 100644 --- a/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj +++ b/WotBlitzStatisticsPro.Blazor/WotBlitzStatisticsPro.Blazor.csproj @@ -16,6 +16,7 @@ +