Projekt

Obecné

Profil

React autentizace » Historie » Verze 11

Jiří Trefil, 2023-04-23 10:03

1 2 Jiří Trefil
h1. Autentizace na straně klienta (React aplikace)
2
3
h2. Popis logiky autentizace
4
5
* Uživatel se přihlásí pod svým účtem. 
6
7
* Klientská aplikace pošle tento požadavek na SPADe aplikaci. Pokud je tento požadavek validní, tj. uživatel opravdu existuje a heslo je správné, pak je zpět odeslán JWT token (https://jwt.io/introduction).
8 3 Jiří Trefil
9
* Klientská aplikace si tento token přečte a uloží jej do cookie. Tento token je od tohoto bodu posílán s *každým* klientským požadavkem na server v hlavičce, viz obrázek hlavičky níže. 
10 4 Jiří Trefil
!clipboard-202304231139-vx5qh.png!
11 3 Jiří Trefil
 
12 5 Jiří Trefil
* Pouze takto je uživatel považován za autentikováno a může se svobodně pohybovat po aplikaci bez omezení.
13
14
15
16
h1. Knihovna *react-auth-kit*
17 6 Jiří Trefil
18 9 Jiří Trefil
* K implementaci této feature byla použita knihovna třetí strany. Knihovna spravuje celý stav autentizace na straně klienta.
19
* Po přihlášení uživatele tedy knihovna uloží jwt token do cookie a následně poskytne 3 hooky (konkrétně useState), které s tímto tokenem manipulují.
20
* Následuje ukázka kódu, která používá knihovnu pro přihlášení uživatele.
21 8 Jiří Trefil
22 11 Jiří Trefil
 h2. Přihlášení uživatele
23
24 8 Jiří Trefil
<pre><code class="react">
25
//importujeme useEffect knihovny pro prihlaseni uzivatele
26
import {useSignIn} from "react-auth-kit";
27
28
//komponenta pro prihlaseni uzivatele
29
const LoginComponent = () => {
30
    //initneme funkci knihovny
31
    //ktera udela vsechnu praci s ukladanim tokenu
32
    const signIn = useSignIn();
33
34
    //dummy funkce, ktera pouze demonstruje, jak se knihovna pouziva
35
    //samotna implementace v kodu je v jadru stejna, pouze je kolem vice omacky
36
    //pro tuto ukazku nedulezite
37
    const sampleLogin = async (username:string, password: string) =>{
38
        //V tomto bode zavolame server s nasim login pozadavkem
39
        //odpoved serveru je ve formatu jako nasledujici rozepsany objekt
40
        //tedy vratime nam status (HTTP code) - tim zjistime, jestli se neco nepokazilo
41
        //zpravu (message) - pro blizsi informace o vysledku informace
42
        //samotny jwt token (token) - timto tokenem se uzivatel autentikuje s kazdym nasledujicim pozadavkem na server
43
        const responseWrapper: {message:string; status:number; token:string} = await login(username,password);
44
        //token muze byt empty string, pokud doslo k chybe prihlaseni
45
        const accessToken:string = responseWrapper.token;
46
        if(responseWrapper.status != 200){
47
        //Zde by byla cast, ktera by vypsala uzivateli chybovou hlasku, protoze se prihlaseni nepovedlo
48
           
49
        }
50
        //volame samotny useEffect pro ulozeni tokenu do cookie
51
        signIn({
52
            //token, ktery ukladame, v nasem pripade promenna accessToken
53
            // cookie bude mit nazev "token"
54
            token:accessToken,
55
            //jak dlouho token zije (v minutach)
56
            expiresIn: 3600,
57
            //typ tokenu, v pripade JWT se jedna o Bearer token
58
            tokenType: "Bearer",
59
            // co dalsiho si chceme ulozit, napriklad jmeno uzivatele, nutne to tu byt nemusi
60
            authState: {userName:username}
61
        });
62
63
        
64
    }
65
66
67
}
68
export default LoginComponent;
69
</code></pre>
70
71
72
 
73 6 Jiří Trefil