32.20. ÐоддеÑжка OAuth #
Ð libpq внедÑена поддеÑжка поÑока авÑоÑизаÑии ÑÑÑÑойÑÑва OAuth 2.0, опиÑанного в RFC 8628, в каÑеÑÑве необÑзаÑелÑного модÑлÑ.
ÐÑли поддеÑжка вклÑÑена и необÑзаÑелÑнÑй модÑÐ»Ñ ÑÑÑановлен, libpq бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð²ÑÑÑоеннÑй поÑок по ÑмолÑаниÑ, еÑли ÑеÑÐ²ÐµÑ Ð² пÑоÑеÑÑе аÑÑенÑиÑикаÑии запÑаÑÐ¸Ð²Ð°ÐµÑ Ñокен Ñипа bearer. Такой поÑок иÑполÑзÑеÑÑÑ, даже еÑли в ÑиÑÑеме, где ÑабоÑÐ°ÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкое пÑиложение, оÑÑÑÑÑÑвÑÐµÑ ÑабоÑий веб-бÑаÑзеÑ, напÑимеÑ, пÑи запÑÑке клиенÑа по SSH.
ÐÑÑÑоеннÑй поÑок по ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÑÐ²ÐµÐ´ÐµÑ URL-адÑÐµÑ Ð´Ð»Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð° и код полÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð°:
$ psql 'dbname=postgres oauth_issuer=https://example.com oauth_client_id=...' ÐеÑейдиÑе на https://example.com/device и введиÑе код: ABCD-EFGH
(ÐÑо пÑиглаÑение можно наÑÑÑоиÑÑ). ÐаÑем полÑзоваÑÐµÐ»Ñ Ð²Ð¾Ð¹Ð´ÑÑ Ð² ÑÑÑÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñвоего поÑÑавÑика OAuth, где бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° ÑазÑеÑение Ð´Ð»Ñ libpq и ÑеÑвеÑа вÑполнÑÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¾Ñ ÐµÐ³Ð¾ имени. ÐÑегда ÑекомендÑеÑÑÑ ÑÑаÑелÑно пÑовеÑÑÑÑ URL-адÑÐµÑ Ð¸ оÑобÑажаемÑе ÑазÑеÑениÑ, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо они ÑооÑвеÑÑÑвÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñм, пÑежде Ñем пÑодолжиÑÑ. Ðе пÑедоÑÑавлÑйÑе ÑазÑеÑÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑм ÑÑеÑÑим ÑÑоÑонам.
ÐлиенÑÑкие пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑеализоваÑÑ ÑобÑÑвеннÑе поÑоки Ð´Ð»Ñ Ð½Ð°ÑÑÑойки взаимодейÑÑÐ²Ð¸Ñ Ð¸ инÑегÑаÑии Ñ Ð¿ÑиложениÑми. Ðолее подÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¿Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкого поÑока в libpq пÑедоÑÑавлена в ÐодÑазделе 32.20.1.
ÐÐ»Ñ ÐºÐ¾ÑÑекÑной ÑабоÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкого поÑока OAuth ÑÑÑока подклÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑодеÑжаÑÑ ÐºÐ°Ðº минимÑм oauth_issuer и oauth_client_id. (ÐÑи паÑамеÑÑÑ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¿Ð¾ÑÑавÑиком OAuth ваÑей компании.) ÐÐ»Ñ Ð²ÑÑÑоенного поÑока Ñакже ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð°Ð²ÑоÑизаÑии OAuth опÑбликовал конеÑнÑÑ ÑоÑÐºÑ Ð°Ð²ÑоÑизаÑии ÑÑÑÑойÑÑва.
ÐÑимеÑание
ÐÑÑÑоеннÑй поÑок авÑоÑизаÑии ÑÑÑÑойÑÑва на даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ поддеÑживаеÑÑÑ Ð½Ð° Windows. Ðднако можно иÑполÑзоваÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие клиенÑÑкие поÑоки.
32.20.1. ÐбÑабоÑÑики Authdata #
ÐÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð»Ð¸ замениÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ поÑока OAuth Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑего API обÑабоÑÑиков:
PQsetAuthDataHook#УÑÑанавливаеÑ
PGauthDataHook, пеÑеопÑеделÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¾Ð´Ð½Ð¸Ð¼ или неÑколÑкими аÑпекÑами клиенÑÑкого поÑока OAuth в libpq.void PQsetAuthDataHook(PQauthDataHook_type hook);
ÐÑли Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа
hookзадано знаÑениеNULL, Ñо бÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановлен обÑабоÑÑик по ÑмолÑаниÑ. РпÑоÑивном ÑлÑÑае пÑиложение пеÑедаÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑнкÑиÑ-обÑабоÑÑик Ñо ÑледÑÑÑей ÑигнаÑÑÑой:int hook_fn(PGauthData type, PGconn *conn, void *data);
libpq бÑÐ´ÐµÑ Ð²ÑзÑваÑÑ ÐµÑ, когда Ð¾Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑебÑеÑÑÑ ÐºÐ°ÐºÐ¾Ðµ-либо дейÑÑвие.
typeопиÑÑÐ²Ð°ÐµÑ Ñип вÑполнÑемого запÑоÑа,connÑвлÑеÑÑÑ Ð´ÐµÑкÑипÑоÑом подклÑÑениÑ, пÑÐ¾Ñ Ð¾Ð´ÑÑего аÑÑенÑиÑикаÑиÑ, аdataÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑпеÑиÑиÑнÑе Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа меÑаданнÑе. СодеÑжимое Ñакого ÑказаÑÐµÐ»Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑомtype; ÑпиÑок поддеÑживаемÑÑ Ñипов опиÑан в ÐодÑазделе 32.20.1.1.ÐбÑабоÑÑики можно обÑединÑÑÑ Ð² ÑепоÑÐºÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¾Ð¿ÐµÑаÑивного и/или ÑезеÑвного поведениÑ. Ðак пÑавило, ÑеализаÑÐ¸Ñ Ð¾Ð±ÑабоÑÑика должна анализиÑоваÑÑ Ð²Ñ Ð¾Ð´ÑÑий Ñип
type(и, возможно, меÑаданнÑе запÑоÑа и/или паÑамеÑÑÑ ÐºÐ¾Ð½ÐºÑеÑного иÑполÑзÑемого подклÑÑениÑconn), ÑÑÐ¾Ð±Ñ ÑеÑиÑÑ, обÑабаÑÑваÑÑ Ð»Ð¸ опÑеделÑннÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð°Ð½Ð½ÑÑ Ð°ÑÑенÑиÑикаÑии. ÐÑли неÑ, он должен делегиÑоваÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¿ÑедÑдÑÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑÑÐ¸ÐºÑ Ð² ÑепоÑке (коÑоÑÑй можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑPQgetAuthDataHook).Ð ÑлÑÑае ÑÑÐ¿ÐµÑ Ð° вÑводиÑÑÑ ÑелоÑиÑленное знаÑение болÑÑе нÑлÑ. ÐÑÑиÑаÑелÑное ÑелоÑиÑленное знаÑение ÑвидеÑелÑÑÑвÑÐµÑ Ð¾Ð± оÑибке и ÑбÑаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð¿ÑÑÐºÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ. (ÐÑлевое знаÑение заÑезеÑвиÑовано Ð´Ð»Ñ ÑеализаÑии по ÑмолÑаниÑ.)
PQgetAuthDataHook#ÐÑÐ²Ð¾Ð´Ð¸Ñ ÑекÑÑее знаÑение
PGauthDataHook.PQauthDataHook_type PQgetAuthDataHook(void);
Ðо вÑÐµÐ¼Ñ Ð¸Ð½Ð¸ÑиализаÑии (до пеÑвого вÑзова
PQsetAuthDataHook) Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑPQdefaultAuthDataHook.
32.20.1.1. Ð¢Ð¸Ð¿Ñ Ð¾Ð±ÑабоÑÑиков #
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑледÑÑÑие ÑÐ¸Ð¿Ñ PGauthData и ÑооÑвеÑÑÑвÑÑÑие им ÑÑÑÑкÑÑÑÑ data:
-
PQAUTHDATA_PROMPT_OAUTH_DEVICE# ÐаменÑÐµÑ ÑÑандаÑÑное пÑиглаÑение полÑзоваÑÐµÐ»Ñ Ð²Ð¾ вÑÑÑоенном клиенÑÑком поÑоке авÑоÑизаÑии ÑÑÑÑойÑÑва.
dataÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑкземплÑÑPGpromptOAuthDevice:typedef struct _PGpromptOAuthDevice { const char *verification_uri; /* verification URI to visit */ const char *user_code; /* user code to enter */ const char *verification_uri_complete; /* optional combination of URI and * code, or NULL */ int expires_in; /* seconds until user code expires */ } PGpromptOAuthDevice;ÐоÑок авÑоÑизаÑии ÑÑÑÑойÑÑва OAuth, коÑоÑÑй можно вклÑÑиÑÑ Ð² libpq, ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÐµÑнÑй полÑзоваÑÐµÐ»Ñ Ð¿ÐµÑеÑел по URL-адÑеÑÑ Ð² бÑаÑзеÑе, а заÑем ввел код, коÑоÑÑй ÑазÑеÑÐ°ÐµÑ libpq подклÑÑиÑÑÑÑ Ðº ÑеÑвеÑÑ Ð¾Ñ ÐµÐ³Ð¾ имени. ÐÑиглаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑоÑÑо вÑводиÑ
verification_uriиuser_codeв ÑÑандаÑÑнÑй поÑок оÑибок. ÐлÑÑеÑнаÑивнÑе ÑеализаÑии могÑÑ Ð¾ÑобÑажаÑÑ ÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð»ÑбÑм пÑедпоÑÑиÑелÑнÑм ÑпоÑобом, напÑимеÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð³ÑаÑиÑеÑкого инÑеÑÑейÑа.ÐÑÐ¾Ñ Ð¾Ð±ÑабоÑÑик вÑзÑваеÑÑÑ ÑолÑко во вÑÑÑоенном поÑоке авÑоÑизаÑии ÑÑÑÑойÑÑва. ÐÑли в пÑиложении ÑÑÑановлен полÑзоваÑелÑÑкий поÑок OAuth или еÑли libpq бÑл ÑобÑан без поддеÑжки вÑÑÑоенного поÑока, Ñо ÑÑÐ¾Ñ Ñип даннÑÑ Ð°ÑÑенÑиÑикаÑии иÑполÑзоваÑÑÑÑ Ð½Ðµ бÑдеÑ.
ÐенÑлевой
verification_uri_completeÐ¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð²Ñвода неÑекÑÑовой пÑовеÑки (напÑимеÑ, QR-кода). Ð Ñаком ÑлÑÑае URL-адÑÐµÑ Ð¸ код полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²Ð¸Ð´Ð½Ñ ÐºÐ¾Ð½ÐµÑÐ½Ð¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, поÑколÑÐºÑ ÐºÐ¾Ð´ вÑÑÑнÑÑ Ð¿Ð¾Ð´ÑвеÑждаеÑÑÑ Ð¿Ð¾ÑÑавÑиком, а URL-адÑÐµÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑм пÑодолжиÑÑ, даже еÑли они не могÑÑ Ð¸ÑполÑзоваÑÑ Ð½ÐµÑекÑÑовÑй меÑод. Ðолее подÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¿ÑедоÑÑавлена в Ñазделе 3.3.1 RFC 8628.-
PQAUTHDATA_OAUTH_BEARER_TOKEN# ÐобавлÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкÑÑ ÑеализаÑÐ¸Ñ Ð¿Ð¾Ñока, заменÑÑ Ð²ÑÑÑоеннÑй поÑок, еÑли он ÑÑÑановлен. ÐбÑабоÑÑик должен либо напÑÑмÑÑ Ð²ÐµÑнÑÑÑ Ñокен Ñипа bearer Ð´Ð»Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñии ÑекÑÑего полÑзоваÑелÑ/издаÑелÑ/облаÑÑи доÑÑÑпа, еÑли он доÑÑÑпен без блокиÑовки, либо ÑÑÑановиÑÑ Ð°ÑÐ¸Ð½Ñ ÑоннÑй обÑабоÑÑик Ð´Ð»Ñ ÐµÐ³Ð¾ полÑÑениÑ.
dataÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑкземплÑÑPGoauthBearerRequest, коÑоÑÑй должен бÑÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½ ÑеализаÑией:typedef struct PGoauthBearerRequest { /* Hook inputs (constant across all calls) */ const char *openid_configuration; /* OIDC discovery URL */ const char *scope; /* required scope(s), or NULL */ /* Hook outputs */ /* Callback implementing a custom asynchronous OAuth flow. */ PostgresPollingStatusType (*async) (PGconn *conn, struct PGoauthBearerRequest *request, SOCKTYPE *altsock); /* Callback to clean up custom allocations. */ void (*cleanup) (PGconn *conn, struct PGoauthBearerRequest *request); char *token; /* acquired Bearer token */ void *user; /* hook-defined allocated data */ } PGoauthBearerRequest;libpq пеÑедаÑÑ Ð¾Ð±ÑабоÑÑÐ¸ÐºÑ Ð´Ð²Ð° ÑлеменÑа инÑоÑмаÑии:
openid_configurationÑодеÑÐ¶Ð¸Ñ URL-адÑÐµÑ Ð´Ð¾ÐºÑменÑа обнаÑÑÐ¶ÐµÐ½Ð¸Ñ OAuth, где пеÑеÑиÑлÑÑÑÑÑ Ð¿Ð¾Ñоки, поддеÑживаемÑе ÑеÑвеÑом авÑоÑизаÑии, аscopeÑодеÑÐ¶Ð¸Ñ (возможно, пÑÑÑой) ÑпиÑок Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ÑеÑвеÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов облаÑÑей доÑÑÑпа OAuth, ÑазделÑннÑÑ Ð¿Ñобелами. Ðдин из паÑамеÑÑов или оба могÑÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°ÑениеNULL, ÑÑо ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñо, ÑÑо инÑоÑмаÑÐ¸Ñ Ð½Ðµ ÑдалоÑÑ Ð¾Ð±Ð½Ð°ÑÑжиÑÑ. (Ð Ñаком ÑлÑÑае ÑеализаÑии могÑÑ Ð¿Ð¾Ð¿ÑÑаÑÑÑÑ ÑÑÑановиÑÑ ÑÑебованиÑ, иÑполÑзÑÑ Ð´ÑÑгÑÑ Ð¿ÑедваÑиÑелÑно наÑÑÑоеннÑÑ Ð¸Ð½ÑоÑмаÑиÑ, или могÑÑ Ð²ÑбÑаÑÑ Ð·Ð°Ð²ÐµÑÑение Ñ Ð¾Ñибкой.)ФиналÑнÑм ÑезÑлÑÑаÑом ÑабоÑÑ Ð¾Ð±ÑабоÑÑика ÑвлÑеÑÑÑ Ð¿Ð°ÑамеÑÑ
token, коÑоÑÑй должен ÑказÑваÑÑ Ð½Ð° дейÑÑвиÑелÑнÑй Ñокен Ñипа bearer Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñи подклÑÑении. (ÐÑÐ¾Ñ Ñокен должен бÑÑÑ Ð²ÑпÑÑен oauth_issuer и ÑодеÑжаÑÑ Ð·Ð°Ð¿ÑаÑиваемÑе облаÑÑи доÑÑÑпа, инаÑе запÑÐ¾Ñ Ð½Ð° Ñоединение бÑÐ´ÐµÑ Ð¾ÑклонÑн модÑлем пÑовеÑки ÑеÑвеÑа.) ÐÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑÑÑока Ñокена должна оÑÑаваÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑной до завеÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ libpq. ÐбÑабоÑÑик должен ÑÑÑановиÑÑ ÑÑнкÑиÑ-обÑабоÑÑикcleanup, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана, когда Ñокен болÑÑе не бÑÐ´ÐµÑ Ð½Ñжен libpq.ÐÑли ÑеализаÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ пÑедоÑÑавиÑÑ
tokenпÑи пеÑвонаÑалÑном вÑзове обÑабоÑÑика, Ñо обÑабаÑÑваÑÑ Ð½ÐµÐ±Ð»Ð¾ÐºÐ¸ÑÑÑÑие опеÑаÑии Ñ ÑеÑвеÑом авÑоÑизаÑии должна ÑÑнкÑиÑ-обÑабоÑÑикasync. [16] ÐÑа ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана Ð´Ð»Ñ Ð½Ð°Ñала поÑока ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле возвÑаÑа из обÑабоÑÑика. Ðогда ÑÑнкÑии-обÑабоÑÑÐ¸ÐºÑ Ð½Ðµ ÑдаÑÑÑÑ Ð¿ÑодолжиÑÑ Ð²Ñполнение без блокиÑовки, она должна веÑнÑÑÑ Ð»Ð¸Ð±Ð¾PGRES_POLLING_READING, либоPGRES_POLLING_WRITING, пÑедваÑиÑелÑно ÑÑÑановив*pgsocketв знаÑение Ñайлового деÑкÑипÑоÑа, коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑен как гоÑовÑй к ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи, когда вÑполнение можно бÑÐ´ÐµÑ Ð¿ÑодолжиÑÑ. (ÐÑÐ¾Ñ Ð´ÐµÑкÑипÑÐ¾Ñ Ð·Ð°Ñем пеÑедаÑÑÑÑ Ð² главнÑй Ñикл опÑоÑа ÑеÑезPQsocket().) ÐоÑле ÑÑÑановкиtokenпÑи ÑÑпеÑном завеÑÑении поÑока возвÑаÑаеÑÑÑPGRES_POLLING_OKилиPGRES_POLLING_FAILEDпÑи оÑибке.РеализаÑии Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ ÑÐ¾Ñ ÑанÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе Ð´Ð»Ñ Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑÑÑа Ð¼ÐµÐ¶Ð´Ñ Ð²Ñзовами ÑÑнкÑий-обÑабоÑÑиков
asyncиcleanup. УказаÑелÑuserпÑедоÑÑавлÑеÑÑÑ Ð´Ð»Ñ ÑÑой Ñели; libpq не бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÐµÐ³Ð¾ ÑодеÑжимое, и пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾ по ÑÐ²Ð¾ÐµÐ¼Ñ ÑÑмоÑÑениÑ. (Ðе забÑвайÑе оÑвобождаÑÑ Ð²ÑделеннÑе ÑеÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¾ÑиÑÑки Ñокена.)
32.20.2. ÐÑладка и паÑамеÑÑÑ Ð´Ð»Ñ ÑазÑабоÑÑика #
Режим «опаÑной оÑладки» можно вклÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÐµÑеменной окÑÑÐ¶ÐµÐ½Ð¸Ñ PGOAUTHDEBUG=UNSAFE. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑионалÑноÑÑÑ Ð¿ÑедоÑÑавлена иÑклÑÑиÑелÑно Ð´Ð»Ñ ÑдобÑÑва локалÑной ÑазÑабоÑки и ÑеÑÑиÑованиÑ. Ðна вклÑÑÐ°ÐµÑ Ð´ÐµÐ¹ÑÑвиÑ, коÑоÑÑе недопÑÑÑÐ¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÑоизводÑÑвенной ÑÑедÑ:
ÑазÑеÑÐ°ÐµÑ Ð¸ÑполÑзование незаÑиÑÑованного пÑоÑокола HTTP пÑи взаимодейÑÑвии Ñ Ð¿Ð¾ÑÑавÑиком OAuth
позволÑÐµÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑиÑÑемнÑй ÑпиÑок ÑеÑÑиÑикаÑов довеÑеннÑÑ Ð¦Ð¡ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÐµÑеменной окÑÑжениÑ
PGOAUTHCAFILEвÑÐ²Ð¾Ð´Ð¸Ñ HTTP-ÑÑаÑик (ÑодеÑжаÑий некоÑоÑÑе кÑиÑиÑеÑкие ÑекÑеÑÑ) в ÑÑандаÑÑнÑй поÑок оÑибок во вÑÐµÐ¼Ñ Ð¿Ð¾Ñока OAuth
позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¸Ð½ÑеÑÐ²Ð°Ð»Ñ Ð¿Ð¾Ð²ÑоÑа Ñ Ð½Ñлевой задеÑжкой, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к беÑконеÑÐ½Ð¾Ð¼Ñ ÑÐ¸ÐºÐ»Ñ Ð½Ð° ÑÑоÑоне клиенÑа и беÑполезной ÑÑаÑе ÑеÑÑÑÑов пÑоÑеÑÑоÑа
ÐÑедÑпÑеждение
Ðе пеÑедавайÑе вÑвод ÑÑаÑика поÑока OAuth ÑÑеÑÑим ÑÑоÑонам. Ðн ÑодеÑÐ¶Ð¸Ñ ÑекÑеÑÑ, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð°Ñаки на ваÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñов и ÑеÑвеÑÑ.
[16] ÐÑполнение блокиÑÑÑÑиÑ
опеÑаÑий во вÑÐµÐ¼Ñ ÑабоÑÑ Ð¾Ð±ÑабоÑÑика PQAUTHDATA_OAUTH_BEARER_TOKEN бÑÐ´ÐµÑ Ð¼ÐµÑаÑÑ ÑабоÑе неблокиÑÑÑÑиÑ
API подклÑÑениÑ, ÑакиÑ
как PQconnectPoll, и пÑепÑÑÑÑвоваÑÑ Ð¿ÑогÑеÑÑÑ Ð¿Ð°ÑаллелÑнÑÑ
подклÑÑений. ÐÑиложениÑ, коÑоÑÑе иÑполÑзÑÑÑ ÑолÑко ÑинÑ
ÑоннÑе пÑимиÑÐ¸Ð²Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ, Ñакие как PQconnectdb, могÑÑ ÑинÑ
Ñонно полÑÑаÑÑ Ñокен во вÑÐµÐ¼Ñ ÑабоÑÑ Ð¾Ð±ÑабоÑÑика вмеÑÑо ÑеализаÑии ÑÑнкÑии-обÑабоÑÑика async, но они бÑдÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ñ Ð¾Ð´Ð½Ð¸Ð¼ подклÑÑением за Ñаз.