Exemplo n.º 1
0
        public async Task EnsureAuthenticatedAsync()
        {
            var sessionStorageContainsToken = await SessionStorage.ContainKeyAsync(TokenSessionItem);

            string authorizationCode            = GetQueryParam("code");
            var    isAuthorizationCodeAvailable = authorizationCode != string.Empty;

            if (!sessionStorageContainsToken && !isAuthorizationCodeAvailable)
            {
                var authorizationQueryParameters = new Dictionary <string, string>
                {
                    { "client_id", AuthConfig.ClientId },
                    { "response_type", "code" },
                    { "redirect_uri", NavigationManager.Uri },
                    { "scope", AuthConfig.Scope },
                };
                NavigationManager.NavigateTo($"{AuthConfig.AuthorizationEndpoint}{await authorizationQueryParameters.ToQueryStringAsync()}");
            }
            else if (!sessionStorageContainsToken && isAuthorizationCodeAvailable)
            {
                var tokenParameters = new Dictionary <string, string>
                {
                    { "grant_type", "authorization_code" },
                    { "code", authorizationCode },
                    { "client_id", AuthConfig.ClientId },
                    { "client_secret", AuthConfig.ClientSecret }
                };

                HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = await HttpClient.PostAsync(AuthConfig.TokenEndpoint, new FormUrlEncodedContent(tokenParameters));

                var token = await JsonSerializer.DeserializeAsync <Token>(await response.Content.ReadAsStreamAsync());

                await SessionStorage.SetItemAsync(TokenSessionItem, token.AccessToken);
            }
            // TODO: here we could check if token is still valid (when sessionStorageContainsToken) and get new one otherwise
        }