50.3. ÐбÑабоÑÑики модÑÐ»Ñ Ð¿ÑовеÑки OAuth #
ÐодÑли пÑовеÑки OAuth ÑеализÑÑÑ ÑÐ²Ð¾Ñ ÑÑнкÑионалÑноÑÑÑ Ð¿ÑÑÑм опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñа обÑабоÑÑиков. СеÑÐ²ÐµÑ Ð²ÑзÑÐ²Ð°ÐµÑ Ð¸Ñ Ð¿Ð¾ меÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð´Ð»Ñ Ð¾Ð±ÑабоÑки запÑоÑа аÑÑенÑиÑикаÑии Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
50.3.1. ÐбÑабоÑÑик запÑÑка #
ÐбÑабоÑÑик startup_cb вÑполнÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно поÑле загÑÑзки модÑлÑ. Ðго можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð½Ð°ÑÑÑойки локалÑного ÑоÑÑоÑÐ½Ð¸Ñ Ð¸ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной иниÑиализаÑии пÑи необÑ
одимоÑÑи. ÐÑли еÑÑÑ Ð´Ð°Ð½Ð½Ñе о ÑоÑÑоÑнии модÑÐ»Ñ Ð¿ÑовеÑки, обÑабоÑÑик Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ state->private_data Ð´Ð»Ñ Ð¸Ñ
Ñ
ÑанениÑ.
typedef void (*ValidatorStartupCB) (ValidatorModuleState *state);
50.3.2. ÐбÑабоÑÑик пÑовеÑки #
ÐбÑабоÑÑик validate_cb вÑполнÑеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ OAuth-обмена, когда полÑзоваÑÐµÐ»Ñ Ð¿ÑÑаеÑÑÑ Ð°ÑÑенÑиÑиÑиÑоваÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ OAuth. ÐÑбое ÑоÑÑоÑние, ÑÑÑановленное во вÑÐµÐ¼Ñ Ð¿ÑедÑдÑÑиÑ
вÑзовов, бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпно в state->private_data.
typedef bool (*ValidatorValidateCB) (const ValidatorModuleState *state,
const char *token, const char *role,
ValidatorModuleResult *result);token ÑодеÑÐ¶Ð¸Ñ Ñокен Ñипа bearer, коÑоÑÑй необÑ
одимо пÑовеÑиÑÑ. Ранее в Postgres Pro пÑовеÑÑлаÑÑ ÑинÑакÑиÑеÑÐºÐ°Ñ ÐºÐ¾ÑÑекÑноÑÑÑ Ñокена, однако никакой дÑÑгой пÑовеÑки не пÑоводилоÑÑ. role ÑодеÑÐ¶Ð¸Ñ ÑолÑ, под коÑоÑой полÑзоваÑÐµÐ»Ñ Ð¿ÑÑаеÑÑÑ Ð²Ð¾Ð¹Ñи. ÐбÑабоÑÑик должен ÑÑÑановиÑÑ Ð²ÑÑ
однÑе паÑамеÑÑÑ Ð² ÑÑÑÑкÑÑÑе result, опÑеделÑнной ÑледÑÑÑим обÑазом:
typedef struct ValidatorModuleResult
{
bool authorized;
char *authn_id;
} ValidatorModuleResult;. ÐодклÑÑение бÑÐ´ÐµÑ Ð¿Ñодолжено, ÑолÑко еÑли модÑÐ»Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ result->authorized в знаÑение true. ÐÐ¼Ñ Ð°ÑÑенÑиÑиÑиÑованного полÑзоваÑÐµÐ»Ñ (опÑеделÑемое Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñокена) должно бÑÑÑ Ð²Ñделено Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ palloc и возвÑаÑено в поле result->authn_id Ð´Ð»Ñ Ð°ÑÑенÑиÑикаÑии полÑзоваÑелÑ. ÐÑоме Ñого, поле result->authn_id Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ NULL, еÑли Ñокен дейÑÑвиÑелен, но ÑвÑзаннÑй Ñ Ð½Ð¸Ð¼ иденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑеделÑн.
ÐодÑÐ»Ñ Ð¿ÑовеÑки Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð·Ð½Ð°Ñение false, ÑÑо ÑигнализиÑÑÐµÑ Ð¾ внÑÑÑенней оÑибке. Ð ÑÑом ÑлÑÑае вÑе паÑамеÑÑÑ ÑезÑлÑÑаÑа игноÑиÑÑÑÑÑÑ, а подклÑÑение пÑеÑÑваеÑÑÑ. РоÑÑалÑнÑÑ
ÑлÑÑаÑÑ
модÑÐ»Ñ Ð¿ÑовеÑки должен возвÑаÑаÑÑ true, ÑказÑваÑ, ÑÑо он обÑабоÑал Ñокен и пÑинÑл ÑеÑение об авÑоÑизаÑии.
Ðоведение поÑле возвÑаÑа из ÑÑнкÑии validate_cb завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑной конÑигÑÑаÑии HBA. ÐбÑÑно Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð² result->authn_id должно ÑоÑно ÑовпадаÑÑ Ñ ÑолÑÑ, под коÑоÑой полÑзоваÑÐµÐ»Ñ Ð¿ÑÑаеÑÑÑ Ð²Ð¾Ð¹Ñи (ÑÑо поведение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñайла ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей). Ðднако пÑи аÑÑенÑиÑикаÑии по пÑÐ°Ð²Ð¸Ð»Ñ HBA Ñ Ð²ÐºÐ»ÑÑÑннÑм паÑамеÑÑом delegate_ident_mapping в Postgres Pro не вÑполнÑÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ пÑовеÑки знаÑÐµÐ½Ð¸Ñ result->authn_id. Ð ÑÑом ÑлÑÑае модÑÐ»Ñ Ð¿ÑовеÑки должен ÑамоÑÑоÑÑелÑно гаÑанÑиÑоваÑÑ, ÑÑо Ñокен ÑодеÑÐ¶Ð¸Ñ Ð´Ð¾ÑÑаÑоÑнÑе пÑава Ð´Ð»Ñ Ð²Ñ
ода под ÑолÑÑ, Ñказанной в role.
50.3.3. ÐбÑабоÑÑик вÑклÑÑÐµÐ½Ð¸Ñ #
ÐбÑабоÑÑик shutdown_cb вÑполнÑеÑÑÑ, когда завеÑÑаеÑÑÑ Ð¾Ð±ÑлÑживаÑÑий пÑоÑеÑÑ, ÑвÑзаннÑй Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑением. ÐÑли еÑÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо ÑоÑ
ÑанÑннÑе даннÑе о ÑоÑÑоÑнии модÑÐ»Ñ Ð¿ÑовеÑки, ÑÑÐ¾Ñ Ð¾Ð±ÑабоÑÑик должен ÑдалиÑÑ Ð¸Ñ
во избежание ÑÑеÑек ÑеÑÑÑÑов.
typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state);