JSON-RPC та Hello World

2 хв читання

JSON-RPC та Hello World

У цьому прикладі створюється простий API endpoint, пов’язаний з користувачем бази даних. Показано два підходи до автентифікації: класичний потік JWT та простіший потік з прямими облiковими даними.

1. Створення користувача та функції

У вашій базі даних (my_database):

-- 1. Create a user who will log in to the API
CREATE ROLE demo_user WITH LOGIN PASSWORD 'user_password';
GRANT USAGE ON SCHEMA api TO demo_user;

-- 2. Create the Hello World function
-- Input: empty jsonb, Output: json
CREATE OR REPLACE FUNCTION api.hello_world(payload jsonb)
RETURNS json
LANGUAGE sql
AS $$
    SELECT '"Hello World"'::json;
$$;

-- 3. Grant permission to the user
GRANT EXECUTE ON FUNCTION api.hello_world(jsonb) TO demo_user;
Який підхід до автентифікації обрати?
Оберіть Варіант A (JWT) для сесій у браузері або для кінцевих користувачів. Оберіть Варіант B (прямі облікові дані) для локальної розробки, скриптів або внутрішніх сервісів — керування токенами не потрібне.

Варіант A: потік з JWT-токеном

Автентифікація за допомогою JWT вимагає, щоб системний користувач PgArachne (pgarachne) міг перемикатися на demo_user:

-- Required for JWT auth only: allow PgArachne to switch to demo_user
GRANT demo_user TO pgarachne;

Крок 1 — отримання JWT

Викличте метод JSON-RPC get_jwt з обліковими даними користувача:

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}'

Відповідь:

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

Крок 2 — виклик функції

Використайте JWT у заголовку 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}'

Відповідь:

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

Варіант B: прямі облікові дані (без JWT)

Надсилайте ім’я користувача PostgreSQL та пароль безпосередньо з кожним запитом за допомогою HTTP Basic Authentication. PgArachne відкриває пул з’єднань від імені цього користувача — команда GRANT … TO pgarachne не потрібна.

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}'

Відповідь:

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

Прапорець -u user:password у curl автоматично встановлює заголовок Authorization: Basic …. Обидва варіанти дають однакові відповіді.

Дивіться Безпека та автентифікація — Прямі облікові дані для повного порівняння всіх методів автентифікації.