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 |