Auth0 – Aplikacja do odpalania rakiet – backend

Zabezpieczenie backendu przed nieautoryzowanym dostępem jest najważniejszym elementem kontroli dostępu. Weryfikacja ograniczona do strony klienta działa jak folia aluminiowa na obrazku:

W tym artykule pokażę jak utworzyłem prostą aplikację backendową, która wymaga autoryzacji z wykorzystaniem Auth0.

Aplikacja jest stworzona w technologii .Net core, zanim zacząłem nad nią pracę miałem już zainstalowany pakiet .Net Core SDK, aby je zainstalować należy wejść na stronę : https://dotnet.microsoft.com/download i wybrać swój system operacyjny i podążać za instrukcjami.

Praca nad aplikacją jest znacznie prostsza z użyciem Visual Studio, ewentualnie Visual Studio Code albo JetBrains Rider, ich instalacja nie jest jednak konieczna.

Tworzenie aplikacji rozpocząłem od wpisania w linię poleceń:

dotnet new web --name SzogunUI.RocketService

Polecenie to tworzy szkielet nowej aplikacji web o nazwie SzogunUI.RocketService

Następnie otworzyłem plik SzogunUI.RocketService\StartUp.cs i zmodyfikowałem metody Configure oraz ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseMvc();
}

Linijki services.AddMvc() oraz app.UseMvc() sprawiają, że aplikacja wspiera wzorzec Mvc, czyli jest podzielona na 3 elementy: Model – zawierający struktury danych wykorzystywane do komunikacji między aplikacją a światem zewnętrznym, Widok (View) – w tej aplikacji nie wykorzystywany, oraz logikę aplikacji w kontrolerach (Controller).

Warunek sprawdzający env.IsDevelopment() sprawia, że w trakcie prac nad projektem aplikacja będzie zwracała dużą ilość szczegółów technicznych dotyczących przyczyny błędu.

Do katalogu SzogunUI.RocketService dodałem katalog Models, który zawiera Modele danych. Pierwszym z nich jest plik MissileType.cs zawierający następujący kod:

namespace SzogunUI.RocketService.Models
{
    public enum MissileType
    {
        Bb,
        Parabelum,
        Cruise,
        TsarBomba
    }
}

Jest to definicja typu wyliczeniowego (enum) zawierającego wszystkie typy pocisków jakie mogą być wysłane przez serwis.

Dodałem też klasę MissileSpec.cs zawierający klasę MissileSpec, opisującą ilość i typ pocisków wysyłanych przez użytkownika.

namespace SzogunUI.RocketService.Models
{
    public class MissileSpec
    {
        public MissileType Type { get; set; }
        public int Amount { get; set; }
    }
}

Następnie w katalogu SzogunUI.RocketLauncher utworzyłem katalog Controllers, a w tym katalogu umieściłem plik IndexController.cs zawierający następujący kod:

using Microsoft.AspNetCore.Mvc;
using SzogunUI.RocketService.Models;
namespace SzogunUI.RocketService.Controllers
{
    public class IndexController : Controller
    {
        [HttpGet]
        [Route("missile-types")]
        public IActionResult GetMissileTypes()
        {
            return Ok(new[]
            {
                MissileType.Bb,
                MissileType.Parabelum,
                MissileType.Cruise,
                MissileType.TsarBomba
            });
        }
        
        [HttpPut]
        [Route("locations/{latitude}/{longitude}")]
        public IActionResult PutMissilesToLocation(
            [FromRoute]double latitude, 
            [FromRoute]double longitude, 
            MissileSpec spec)
        {
            return Ok();
        }
    }
}

Zawiera on klasę IndexController będącą pierwszym kontrolerem w naszej aplikacji. Klasa dziedziczy po klasie Controller, nie jest to wymagane, ale ułatwia pracę. Zawiera ona dwie metody:

  • GetMissileTypes – zwracającą tablicę dostępnych typów pocisków
  • PutMissilesToLocation – pobierającą współrzędne geograficzne i specyfikację pocisków – odpowiedzialną za wysłanie pocisków w określoną lokalizację. Metodę pozostawiam pustą

Kod zawiera także inne elementy: Atrybuty Route definiują ścieżkę pod jaką dana metoda będzie dostępna np. Route(„missile-type”) mówi, że akcja będzie dostępna pod adresem [adres-serwera]/missile-types np. https://localhost:5001/missile-types. Atrybut HttpGet oznacza, że metoda służy do pobierania danych i że można ją wywołać po prostu wpisując w przeglądarkę odpowiedni adres, istnieją atrybuty HttpPut, HttpPost i HttpDelete, które oznaczają że metoda wymaga zapytania put, post albo delete, ręczne wywołanie metod oznaczonych tymi atrybutami wymaga narzędzi typu Postman, curl czy wtyczka do chrome Advanced REST Client. Serwis będzie wywoływany przez aplikacje klienckie, a nie bezpośrednio przez użytkowników, nie musisz się więc przejmować tym utrudnieniem.

Działanie atrybutu FromRoute na parametrze metody najłatwiej wyjaśnić na przypadku metody PutMissilesToLocation. Ścieżka (atrybut Route) zawiera fragmenty {latitude} i {longitude} odpowiednie parametry metody posiadają Atrybut FromRoute oznacza to , że Mvc spróbuje dopasować fragment ścieżki i przekazać go jako parametr metody np. użycie ścieżki /locations/52.20/21.00 spowoduje wysłanie pocisków w kierunku Mokotowa.

Ostatnim elementem użytym w tym fragmencie kodu jest metoda Ok, do której można przekazać parametr. Generuje ona odpowiedź mówiącą, że obsługa wywołania się udała, a jej opcjonalny parametr jest zamieniany w zwracany tekst. Istnieją inne metody takie jak BadRequest albo UnAuthorized, mówiące, że nie udało się przetworzyć wywołania i dające aplikacji klienckiej pewne wskazówki o przyczynie tego problemu.

Na tym etapie po uruchomieniu aplikacji da się z nią rozmawiać po http, np .wpisując w przeglądarkę https://localhost:5001/missile-types. Niestety zamiast nazw typów pocisków aplikacja zwraca: [0,1,2,3]. Aby to naprawić Należy do metody ConfiureServices w klasie Startup dodać wywołanie metody AddJsonOptions:

services
    .AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()));

Zaś w sekcji using dodać wpis

using Newtonsoft.Json.Converters;

Teraz metoda zwraca już poprawny wynik.

2 odpowiedzi do “Auth0 – Aplikacja do odpalania rakiet – backend”

  1. Pingback: dotnetomaniak.pl

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *