libpq에 설명된 OAuth v2 장치 승인 클라이언트 흐름에 대한 지원을 구현합니다.RFC 8628, 선택적 모듈로. 참조설치 문서기본 제공 흐름으로 기기 인증 지원을 활성화하는 방법에 대한 정보입니다.
지원이 활성화되고 옵션 모듈이 설치된 경우,libpq서버의 경우 기본적으로 내장 흐름을 사용합니다PostgreSQL : 문서인증 중. 이 흐름은 클라이언트 애플리케이션을 실행하는 시스템에 사용 가능한 웹 브라우저가 없는 경우에도 활용될 수 있습니다(예: 다음을 통해 클라이언트를 실행하는 경우).SSH.
내장된 흐름은 기본적으로 방문할 URL과 거기에 입력할 사용자 코드를 인쇄합니다:
$ psql 'dbname=postgres 토토 핫_issuer=https://example.com 토토 핫_client_id=...' https://example.com/device를 방문하여 ABCD-EFGH 코드를 입력하세요.
(이 메시지는 다음과 같습니다.맞춤형.) 그런 다음 사용자는 OAuth 공급자에 로그인하여 libpq와 서버가 사용자를 대신하여 작업을 수행하도록 허용할지 여부를 묻습니다. 계속하기 전에 항상 표시되는 URL과 권한을 주의 깊게 검토하여 예상과 일치하는지 확인하는 것이 좋습니다. 신뢰할 수 없는 제3자에게 권한을 부여해서는 안 됩니다.
클라이언트 응용프로그램은 응용프로그램과의 상호작용 및 통합을 사용자 정의하기 위해 자체 흐름을 구현할 수 있습니다. 참조섹션 32.20.1사용자 정의 흐름을 추가하는 방법에 대한 자세한 내용은libpq.
OAuth 클라이언트 흐름을 사용하려면 연결 문자열에 최소한 다음이 포함되어야 합니다.토토 핫_issuer그리고토토 핫_client_id. (이러한 설정은 조직의 토토 핫 제공업체에 의해 결정됩니다.) 기본 제공 흐름에서는 기기 승인 엔드포인트를 게시하기 위해 토토 핫 승인 서버가 추가로 필요합니다.
내장된 장치 인증 흐름은 현재 Windows에서 지원되지 않습니다. 사용자 정의 클라이언트 흐름은 계속 구현될 수 있습니다.
OAuth 흐름의 동작은 다음 후크 API를 사용하여 클라이언트에 의해 수정되거나 대체될 수 있습니다.
PQsetAuthDataHook #설정PGauthDataHook, 재정의libpq이 토토 핫 클라이언트 흐름의 하나 이상의 측면을 처리합니다.
void PQsetAuthDataHook(PQauthDataHook_type 후크);
만약후크isNULL, 기본 핸들러가 다시 설치됩니다. 그렇지 않으면 애플리케이션은 서명이 있는 콜백 함수에 대한 포인터를 전달합니다.
int Hook_fn(PGauthData 유형, PGconn *conn, void *data);
어떤libpq애플리케이션에 작업이 필요할 때 호출됩니다.유형요청이 이루어진 것을 설명합니다.콘인증 중인 연결 핸들이고데이터요청별 메타데이터를 가리킵니다. 이 포인터의 내용은 다음과 같이 결정됩니다.유형; 참조섹션 32.20.1.1지원 목록에 대해.
후크를 서로 연결하여 협력 및/또는 대체 동작을 허용할 수 있습니다. 일반적으로 후크 구현은 수신을 검사해야 합니다.유형(그리고 잠재적으로 요청 메타데이터 및/또는 특정에 대한 설정콘사용 중)을 사용하여 특정 인증 데이터를 처리할지 여부를 결정합니다. 그렇지 않은 경우 체인의 이전 후크에 위임해야 합니다(다음을 통해 검색 가능).PQgetAuthDataHook).
성공은 0보다 큰 정수를 반환함으로써 표시됩니다. 음의 정수를 반환하면 오류 상태를 알리고 연결 시도를 중단합니다. (기본 구현을 위해 0 값이 예약되어 있습니다.)
PQgetAuthDataHook #현재 값을 검색합니다PGauthDataHook.
PQauthDataHook_type PQgetAuthDataHook(void);
초기화 시간에(첫 번째 호출 전PQsetAuthDataHook), 이 함수는 다음을 반환합니다.PQdefaultAuthDataHook.
다음PGauthData유형 및 해당데이터구조가 정의되었습니다:
PQAUTHDATA_PROMPT_토토 핫_DEVICE #내장 장치 승인 클라이언트 흐름 중에 기본 사용자 프롬프트를 대체합니다.데이터다음 인스턴스를 가리킴PGprompt토토 핫Device:
typedef 구조체 _PGprompt토토 핫Device
const char *verification_uri; /* 방문할 인증 URI */
const char *user_code; /* 입력할 사용자 코드 */
const char *verification_uri_complete; /* URI와 URI의 선택적 조합
* 코드 또는 NULL */
int 만료_인; /* 사용자 코드가 만료될 때까지의 초 */
PGprompt토토 핫Device;
토토 핫 장치 승인 흐름포함 가능에libpq최종 사용자는 브라우저를 사용하여 URL을 방문한 다음 허용하는 코드를 입력해야 합니다.libpq그들을 대신하여 서버에 연결합니다. 기본 프롬프트는 단순히를 인쇄합니다.verification_uri그리고user_code표준 오류에 대해. 대체 구현에서는 선호하는 방법(예: GUI)을 사용하여 이 정보를 표시할 수 있습니다.
이 콜백은 내장된 장치 인증 흐름 중에만 호출됩니다. 애플리케이션이 다음을 설치하는 경우맞춤 토토 핫 흐름또는libpq기본 제공 흐름을 지원하도록 구축되지 않았으므로 이 인증 데이터 유형은 사용되지 않습니다.
NULL이 아닌 경우verification_uri_complete이 제공되면 선택적으로 비텍스트 확인(예: QR 코드 표시)에 사용할 수 있습니다. 이 경우 URL과 사용자 코드는 공급자가 수동으로 코드를 확인하고 URL을 통해 사용자가 비텍스트 방법을 사용할 수 없는 경우에도 계속할 수 있으므로 최종 사용자에게 계속 표시되어야 합니다. 자세한 내용은 섹션 3.3.1을 참조하세요.RFC 8628.
PQAUTHDATA_토토 핫_BEARER_TOKEN #흐름의 사용자 정의 구현을 추가하고, 내장된 흐름이 있는 경우 대체설치됨. 후크는 차단 없이 사용할 수 있는 경우 현재 사용자/발행자/범위 조합에 대한 Bearer 토큰을 직접 반환하거나, 그렇지 않으면 비동기 콜백을 설정하여 이를 검색해야 합니다.
데이터다음 인스턴스를 가리킴PG토토 핫BearerRequest, 구현 시 채워져야 합니다.
typedef 구조체 PG토토 핫BearerRequest
/* 후크 입력(모든 호출에서 일정함) */
const char *openid_configuration; /* OIDC 검색 URL */
const char *범위; /* 필수 범위 또는 NULL */
/* 후크 출력 */
/* 사용자 정의 비동기 OAuth 흐름을 구현하는 콜백. */
PostgresPollingStatusType (*async) (PGconn *conn,
구조체 PG토토 핫BearerRequest *요청,
SOCKTYPE *altsock);
/* 사용자 정의 할당을 정리하기 위한 콜백. */
void (*cleanup) (PGconn *conn, struct PG토토 핫BearerRequest *request);
char *토큰; /* Bearer 토큰 획득 */
무효 *사용자; /* 후크 정의 할당 데이터 */
PG토토 핫BearerRequest;
다음에 의해 후크에 두 가지 정보가 제공됩니다.libpq: openid_configuration인증 서버의 지원 흐름을 설명하는 OAuth 검색 문서의 URL이 포함되어 있으며범위서버에 액세스하는 데 필요한 공백으로 구분된 OAuth 범위 목록(비어 있을 수 있음)을 포함합니다. 둘 중 하나 또는 둘 다일 수 있습니다.NULL정보를 검색할 수 없음을 나타냅니다. (이 경우 구현은 사전 구성된 다른 지식을 사용하여 요구 사항을 설정할 수 있거나 실패하도록 선택할 수 있습니다.)
후크의 최종 출력은 다음과 같습니다.토큰, 연결에 사용할 유효한 Bearer 토큰을 가리켜야 합니다. (이 토큰은 다음에서 발행되어야 합니다.토토 핫_issuer요청된 범위를 유지하지 않으면 서버의 유효성 검사기 모듈에 의해 연결이 거부됩니다.) 할당된 토큰 문자열은 다음까지 유효해야 합니다.libpq연결이 완료되었습니다. 후크는 a를 설정해야 합니다.정리언제 호출될 콜백libpq더 이상 필요하지 않습니다.
구현이 즉시 생성할 수 없는 경우토큰후크에 대한 초기 호출 중에는 다음을 설정해야 합니다.비동기인증 서버와의 비차단 통신을 처리하기 위한 콜백.[16]후크에서 반환되는 즉시 흐름을 시작하기 위해 호출됩니다. 콜백이 차단 없이 더 이상 진행될 수 없는 경우 다음 중 하나를 반환해야 합니다.PGRES_POLLING_READING또는PGRES_POLLING_WRITING설정 후*pgsocket진행이 다시 이루어질 수 있을 때 읽기/쓰기 준비가 된 것으로 표시될 파일 설명자에. (이 설명자는 다음을 통해 최상위 폴링 루프에 제공됩니다.PQsocket().) 복귀PGRES_POLLING_OK설정 후토큰흐름이 완료되면, 또는PGRES_POLLING_FAILED실패를 나타냅니다.
구현 시 호출 전반에 걸쳐 기록을 위해 추가 데이터를 저장할 수 있습니다.비동기그리고정리콜백.사용자이 목적을 위해 포인터가 제공됩니다.libpq내용은 건드리지 않으며 응용 프로그램은 편리하게 사용할 수 있습니다. (토큰 정리 중에 할당을 해제하는 것을 잊지 마세요.)
환경 변수를 설정하면 "위험한 디버깅 모드"가 활성화될 수 있습니다.PG토토 핫DEBUG=안전하지 않음. 이 기능은 로컬 개발 및 테스트를 쉽게 하기 위해서만 제공됩니다. 프로덕션 시스템에서 원하지 않는 여러 가지 작업을 수행합니다.
토토 핫 공급자 교환 중에 암호화되지 않은 HTTP 사용을 허용합니다.
다음을 사용하여 시스템의 신뢰할 수 있는 CA 목록을 완전히 교체할 수 있습니다.PG토토 핫CAFILE환경변수
토토 핫 흐름 중에 HTTP 트래픽(몇 가지 중요한 비밀 포함)을 표준 오류로 인쇄합니다.
0초 재시도 간격의 사용을 허용합니다. 이로 인해 클라이언트가 바쁜 루프를 일으키고 무의미하게 CPU를 소비하게 될 수 있습니다.
토토 핫 흐름 트래픽의 출력을 제3자와 공유하지 마십시오. 여기에는 클라이언트와 서버를 공격하는 데 사용할 수 있는 비밀이 포함되어 있습니다.
[16]중 차단 작업 수행 중PQAUTHDATA_토토 핫_BEARER_TOKEN후크 콜백은 다음과 같은 비차단 연결 API를 방해합니다.PQconnectPoll동시 연결이 진행되지 않도록 방지합니다. 다음과 같은 동기 연결 기본 요소만 사용하는 애플리케이션PQconnectdb, 구현하는 대신 후크 중에 토큰을 동기적으로 검색할 수 있습니다.비동기콜백이지만 반드시 한 번에 하나의 연결로 제한됩니다.