JSON-RPC i Hello World

2 min czytania

JSON-RPC & Hello World

Ten przykład tworzy prosty endpoint API powiązany z użytkownikiem bazy danych. Pokazane są dwa podejścia do autentykacji: klasyczny przepływ JWT oraz prostszy przepływ z bezpośrednimi danymi uwierzytelniającymi.

1. Utworzenie użytkownika i funkcji

W twojej bazie danych (my_database):

-- 1. Utwórz użytkownika, który będzie logować się do API
CREATE ROLE demo_user WITH LOGIN PASSWORD 'user_password';
GRANT USAGE ON SCHEMA api TO demo_user;

-- 2. Utwórz funkcję Hello World
-- Input: pusty jsonb, Output: json
CREATE OR REPLACE FUNCTION api.hello_world(payload jsonb)
RETURNS json
LANGUAGE sql
AS $$
    SELECT '"Hello World"'::json;
$$;

-- 3. Przyznaj uprawnienie użytkownikowi
GRANT EXECUTE ON FUNCTION api.hello_world(jsonb) TO demo_user;
Które podejście do autentykacji wybrać?
Wybierz Opcję A (JWT) dla sesji opartych na przeglądarce lub sesji użytkowników końcowych. Wybierz Opcję B (bezpośrednie dane uwierzytelniające) dla lokalnego developmentu, skryptów lub usług wewnętrznych — zarządzanie tokenami nie jest wymagane.

Opcja A: Przepływ z tokenem JWT

Autentykacja JWT wymaga, aby użytkownik systemowy PgArachne (pgarachne) mógł przełączyć się na demo_user:

-- Wymagane tylko dla autentykacji JWT: pozwala PgArachne przełączyć się na demo_user
GRANT demo_user TO pgarachne;

Krok 1 — Uzyskanie JWT

Wywołaj metodę JSON-RPC get_jwt z danymi uwierzytelniającymi użytkownika:

curl -X POST http://localhost:8080/db/my_database/jsonrpc \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"get_jwt","params":{"login":"demo_user","password":"user_password"},"id":1}'

Odpowiedź:

{"jsonrpc":"2.0","result":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"id":1}

Krok 2 — Wywołanie funkcji

Użyj JWT w nagłówku Authorization:

export TOKEN="YOUR_JWT_TOKEN_HERE"

curl -X POST http://localhost:8080/db/my_database/jsonrpc \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"api.hello_world","params":{},"id":1}'

Odpowiedź:

{"jsonrpc":"2.0","result":"Hello World","id":1}

Opcja B: Bezpośrednie dane uwierzytelniające (bez JWT)

Wysyłaj nazwę użytkownika i hasło PostgreSQL bezpośrednio z każdym żądaniem, używając HTTP Basic Authentication. PgArachne otwiera pool połączeń jako ten użytkownik — GRANT … TO pgarachne nie jest potrzebny.

curl -X POST http://localhost:8080/db/my_database/jsonrpc \
  -u demo_user:user_password \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"api.hello_world","params":{},"id":1}'

Odpowiedź:

{"jsonrpc":"2.0","result":"Hello World","id":1}

Flaga -u user:password w curl automatycznie ustawia nagłówek Authorization: Basic …. Obie opcje dają identyczne odpowiedzi.

Zobacz Bezpieczeństwo i autentykacja — Bezpośrednie dane uwierzytelniające dla pełnego porównania wszystkich metod autentykacji.