GraphQL.cz/Fórum/Jak na autentizaci pomocí JWT v GraphQL?

Jak na autentizaci pomocí JWT v GraphQL?

Mám otázku ohledně autentizace v GraphQL. Zkouším implementovat JWT, ale nějak mi to nefunguje tak, jak bych si představoval. Vím, že JSON Web Token je populární metoda pro autentizaci a autorizaci uživatelů, ale když se pokouším začlenit to do svého GraphQL API, všechno se zdá být dost komplikované. Jak to vlastně funguje? Měl bych token generovat na serverové straně při přihlášení uživatele a pak ho předávat klientovi? A co dál? Jakým způsobem by měl klient tyto tokeny ukládat? Slyšel jsem, že localStorage je jedna možnost, ale je to bezpečné? Pak se chci zeptat, jak by měl vypadat middleware na serveru pro ověřování těchto tokenů při každém požadavku. Mám použít nějakou knihovnu jako například jsonwebtoken v Node.js nebo něco jiného? Jak řešit expiraci tokenu? Je potřeba regenerovat token po nějaké době nebo ho mohu nechat platit napořád? A co když uživatel chce odhlásit – jak nejlépe invalidovat token? Snad jsem na nic nezapomněl, ale fakt bych ocenil nějaké příklady nebo tipy, protože se v tom docela ztrácím. Dík moc za pomoc!

170 slov
1.7 minut čtení
27. 4. 2024
Lenka Pazderová

Tak jo, tady je pár tipů, jak na tu autentizaci s JWT v GraphQL. První věc, co uděláš, je, že při přihlášení uživatele na serveru generuješ ten JWT token, a pak ho pošleš klientovi. Ten si ho klidně může uložit do localStorage, ale má to svoje rizika, jako XSS útoky. Někteří radí spíš sessionStorage nebo cookies s HttpOnly flagem, aby se to tak snadno nevykradlo.

Na serveru potřebuješ middleware, který bude ověřovat ten token při každém požadavku. Klidně použij knihovnu jako jsonwebtoken v Node.js. To ti usnadní práci s podepisováním a ověřováním tokenů. Ověření bys měl udělat v kontextu GraphQL, takže můžeš mít dostupné informace o uživateli v rámci resolverů.

Co se týče expirace tokenu, je dobrý mít nějakou dobu platnosti, třeba 15-30 minut. Po uplynutí té doby se buď můžeš snažit regenerovat token (refresh token flow) nebo ho prostě nechat vypršet a donutit uživatele se přihlásit znova. Pokud chceš invalidovat token při odhlášení, tak je to složitější - můžeš třeba mít blacklist na serveru pro neplatné tokeny.

Zkus si projít nějaké příklady na GitHubu nebo blogy o GraphQL a JWT. Občas tyhle věci chtějí vyzkoušet víc než jednou, než to začne fungovat. Držím palce!

192 slov
1.9 minut čtení
18. 1. 2025
Monika Malečková

Takže, k autentizaci přes JWT v GraphQL. Prvně, jak píšeš, musíš generovat token na serveru, když se uživatel přihlásí. Tenhle token pak pošleš klientovi. Klient by měl ten token ukládat, takže localStorage je jedna možnost, ale jo, není to úplně bezpečné. Můžeš taky zvážit sessionStorage nebo cookies s HttpOnly flagem pro větší bezpečnost.

Na serverovou stranu si vytvoř middleware, který použiješ pro ověřování tokenu při každém požadavku. K tomu je fakt dobrý použít knihovnu jako jsonwebtoken v Node.js. Ověříš tam platnost tokenu a jestli je správně podepsaný.

S expirací tokenu je to tak, že většinou nastavíš nějakou dobu platnosti (třeba 1 hodina). Můžeš udělat refresh token mechanismus, kde dostaneš nový token před vypršením toho starého, nebo ho nechat platit napořád, ale to není nejlepší nápad kvůli bezpečnosti.

Když chce uživatel odhlásit, tak prostě zrušíš token na klientovi a můžeš mít na serveru blacklist pro neplatné tokeny. Takže, pokud bys měl nějaké další dotazy nebo potřeboval víc detailů, dej vědět.

159 slov
1.6 minut čtení
5. 1. 2025
Žaneta Bezděková

Takže, autentizace s JWT v GraphQL je v podstatě o tom, jak si udržet uživatele přihlášeného a ověřit, kdo se ptá na co. Nejprv musíš generovat token na serveru, když se uživatel přihlásí. Potom tenhle token pošli zpět na klienta. Klient si ho může ukládat třeba do localStorage nebo sessionStorage, ale localStorage má svý rizika, protože je to zranitelné vůči XSS útokům. Takže hodně lidi radši používá sessionStorage nebo cookies, ale to záleží na tvým projektu.

Na serveru pak potřebuješ middleware, co ověří ten token u každého požadavku. K tomu můžeš použít knihovnu jako jsonwebtoken v Node.js, která je celkem jednoduchá. Ověření tokenu by mělo být součástí tvého serverového kódu, takže při každém dotazu zkontroluj platnost tokenu a jestli je správně podepsaný.

Co se týče expirace tokenu – většina lidí nastavuje expiraci (třeba 1-2 hodiny), což je bezpečnější než mít token navždy platný. Můžeš pak udělat refresh token systém, kde po expirovaní dostaneš nový token a starý invaliduješ.

A pokud chceš uživatele odhlásit, tak prostě smaž token z localStorage nebo sessionStorage na klientovi. Tím se prevence dalšího použití zajistí. Ale pokud chceš větší bezpečnost, můžeš mít blacklist na serveru pro invalidaci starých tokenů.

Snad jsem ti pomohl! Je to trošku chaos, ale když to jednou nastavíš, tak to jede.

206 slov
2.1 minut čtení
4. 1. 2025
Libor Odehnal
GraphQL.cz/Články/GraphQL a mobilní zařízení
Zavedení autentizace s využitím JWT v GraphQL aplikacích pro mobilní zařízeníPodrobný návod na implementaci JSON Web Tokens (JWT) pro zabezpečení GraphQL API, které jsou ideální pro mobilní aplikace, s důrazem na praktické použ...
1000 slov
10 minut čtení
7. 12. 2023
Markéta Svobodová
Přečíst článek
Podobné otázky