GraphQL.cz/Články/Autentizace v GraphQL

Implementace JWT autentizace v GraphQL API: Kompletní průvodce

Naučte se, jak implementovat JWT (JSON Web Token) autentizaci pro zabezpečení vašeho GraphQL API. Tento podrobný návod vás provede všemi kroky, od základního nastavení až po pokročilé techniky.

564 slov
5.6 minut čtení
21. 4. 2023
Richard Malý

Vítejte ve světě zabezpečení: Jak na JWT autentizaci v GraphQL API

Představte si, že máte úžasné GraphQL API, které s radostí poskytuje data vašim aplikacím. Ale co když vám někdo ukradne přístup? Nebojte se! Dneska se podíváme na to, jak implementovat JWT (JSON Web Token) autentizaci a ochránit vaše API jako pravý superhrdina.

Co je JWT?

JWT je zkratka pro JSON Web Token. Je to bezpečný způsob, jak předávat informace mezi klientem a serverem. Tokeny jsou digitálně podepsané a obsahují zakódované informace, což znamená, že je lze snadno ověřit a použít ke sledování uživatelských relací. Ale co to všechno znamená pro vaše GraphQL API?

Proč používat JWT s GraphQL?

GraphQL je skvělý nástroj pro dotazy a manipulaci s daty. Nicméně, pokud chcete zabezpečit citlivé informace ve svém API, potřebujete efektivní metodu autentizace. Zde přichází na řadu JWT! Pomocí JWT můžete zajistit:

  • Bezpečnost: Uživatelé se musí přihlásit a získat token.
  • Flexibilitu: Tokeny lze snadno posílat s každým požadavkem.
  • Škálovatelnost: Můžete snadno rozšířit své API bez obav o relace na serveru.

Jak začít s implementací JWT v GraphQL API?

Krok 1: Nastavení prostředí

Než začneme kódovat, ujistěte se, že máte nainstalované potřebné nástroje. Pro náš příklad použijeme Node.js s Express a Apollo Server.

npm init -y
npm install express apollo-server graphql jsonwebtoken bcryptjs cors
dotenv
Krok 2: Vytvoření serveru

Vytvořme jednoduchý Express server s Apollo Server:

const express = require('express');
const \{ ApolloServer \} = require('apollo-server-express');
const typeDefs = `
  type User \{
    id: ID!
    username: String!
    email: String!
  \}
  type Query \{
    users: [User]
  \}
`;
const resolvers = \{ Query: \{ users: () =\> [] \} \};
const app = express();
const server = new ApolloServer(\{ typeDefs, resolvers \});
server.applyMiddleware(\{ app \});
app.listen(\{ port: 4000 \}, () =\> console.log(`Server ready at http://localhost:4000$\{server.graphqlPath\}`));
Krok 3: Přidání autentizace pomocí JWT

Nyní přidáme logiku pro registraci a přihlašování uživatelů. Začněme s registrací:

const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const users = []; // Tento seznam později nahradíme skutečnou databází.
const SECRET_KEY = 'toto-je-tajny-klic'; // V reálném světě byste použili bezpečnější řešení.

const registerUser = async (username, password) =\> \{
  const hashedPassword = await bcrypt.hash(password, 10);
  const newUser = \{ id: users.length + 1, username, password: hashedPassword \};
  users.push(newUser);
  return newUser;
\};
Krok 4: Přihlašování uživatelů

Nyní vytvoříme funkci pro přihlášení uživatelů a generování tokenu:

const loginUser = async (username, password) =\> \{
  const user = users.find(u =\> u.username === username);
  if (!user || !(await bcrypt.compare(password, user.password))) \{
    throw new Error('Invalid credentials');
  \}
  const token = jwt.sign(\{ id: user.id \}, SECRET_KEY);
  return \{ token \};
\};
Krok 5: Ochrana souvisejících dotazů pomocí middleware

Nyní musíme zajistit, aby naše dotazy byly chráněny pomocí tokenu. Přidejte middleware do svého serveru:

app.use((req, res, next) =\> \{
  const token = req.headers.authorization || '';
  if (token) \{
    try \{
      const decoded = jwt.verify(token.replace('Bearer ', ''), SECRET_KEY);
      req.userId = decoded.id;
    \} catch (err) \{
      console.error(err);
    \}
  \}
  next();
\});
Krok 6: Ochrana dotazů ve resolverech

Nyní můžete chránit určité dotazy ve vašich resolverech používáním req.userId:

const resolvers = \{
  Query: \{
    users: (parent, args, context) =\> \{
      if (!context.req.userId) throw new Error('Unauthorized');
      return users;
    \},
synced with your environment and goals."\},
13989 přečtení článku
449 lajků
21. 4. 2023
Richard Malý
  • JWT

  • GraphQL

  • API

  • autentizace

  • Node.js

  • bezpečnost

  • jsonwebtoken

  • Apollo Server

  • Express

  • uživatelské relace

O autorovi

Richard Malý

Security expert se zaměřením na API bezpečnost. Po 10 letech v oblasti kybernetické bezpečnosti se specializuje na zabezpečení GraphQL endpointů. Vystudoval kybernetickou bezpečnost na ČVUT. Píše články o bezpečnostních best practices

Dotazy k článku