LIBPQ는 OAUTH V2 장치 인증 클라이언트 흐름에 대한 지원을 구현합니다.RFC 8628, 서버 인 경우 기본적으로 사용하려고 시도합니다PostgreSQL : 문서인증 중. 클라이언트 애플리케이션을 실행하는 시스템에 사용 가능한 웹 브라우저가없는 경우 에도이 흐름을 활용할 수 있습니다.SSH. 클라이언트 응용 프로그램은 대신 자체 흐름을 구현할 수 있습니다.섹션 32.20.1.
내장 흐름은 기본적으로 방문 할 URL과 여기에 입력 할 사용자 코드를 인쇄합니다.
$ psql 'dbname = postgres 토토 핫_issuer = https : //example.com 토토 핫_client_id = ...'
(이 프롬프트가 될 수 있습니다사용자 정의.) 그런 다음 사용자는 OAUTH 제공 업체에 로그인하여 LIBPQ와 서버가 자신을 대신하여 작업을 수행 할 수 있는지 묻습니다. 계속하기 전에 URL과 명시된 권한을 신중하게 검토하여 기대치를 일치시키기 전에 신중하게 검토하는 것이 좋습니다.
토토 핫 클라이언트 흐름을 사용할 수 있으려면 연결 문자열은 최소한으로 포함되어야합니다토토 핫_issuerand토토 핫_client_id. (이러한 설정은 조직의 토토 핫 제공 업체에 의해 결정됩니다.) 내장 흐름은 추가로 토토 핫 인증 서버가 장치 인증 엔드 포인트를 게시하도록 요구합니다..
내장 장치 인증 흐름은 현재 Windows에서 지원되지 않습니다. 사용자 정의 클라이언트 흐름은 여전히 구현 될 수 있습니다.
다음 후크 API를 사용하여 클라이언트가 OAUTH 흐름의 동작을 수정하거나 대체 할 수 있습니다 :
pqsetauthdatahook
#설정pgauthdatahook
, 재정의libpq'토토 핫 클라이언트 흐름의 하나 이상의 측면을 처리합니다.
void pqsetauthdatahook (pqauthdatahook_type hook);
ifhook
isNULL
, 기본 핸들러가 다시 설치됩니다. 그렇지 않으면 응용 프로그램은 서명이있는 콜백 함수에 대한 포인터를 전달합니다.
int hook_fn (pgauthdata 유형, pgconn *conn, void *data);
whylibpq응용 프로그램에 대한 조치가 필요할 때 호출합니다.타입
요청에 대한 설명,conn
연결 핸들이 인증되고 있으며데이터
요청 별 메타 데이터를 가리 킵니다. 이 포인터의 내용은에 의해 결정됩니다.타입
; 보다섹션 32.20.1.1지원되는 목록의 경우
훅은 협력 및/또는 폴백 행동을 허용하기 위해 함께 묶을 수 있습니다. 일반적으로 후크 구현은 들어오는 것을 조사해야합니다타입
(및 잠재적으로 요청 메타 데이터 및/또는 특정 설정conn
사용 중) 특정 AuthData를 처리할지 여부를 결정합니다. 그렇지 않은 경우 체인의 이전 후크에 위임해야합니다 (reachiblepqgetauthdatahook
).
성공은 0보다 큰 정수를 반환하여 표시됩니다. 음의 정수를 반환하면 오류 조건을 신호하고 연결 시도를 포기합니다.
pqgetauthdatahook
#현재 값을 검색pgauthdatahook
.
pqauthdatahook_type pqgetauthdatahook (void);
초기화 시간에 (첫 번째 호출 전pqsetauthdatahook
),이 함수는 반환됩니다pqdefaultauthdatahook
.
다음pgauthdata
유형 및 해당 해당데이터
구조가 정의되어 있습니다 :
pqauthdata_prompt_토토 핫_device
#내장 장치 인증 클라이언트 흐름에서 기본 사용자 프롬프트를 대체합니다.데이터
인스턴스를 가리 킵니다pgprompt토토 핫device
:
typedef struct _pgprompt토토 핫device
토토 핫 장치 승인 흐름에 포함libpq최종 사용자가 브라우저를 사용하여 URL을 방문한 다음 허용하는 코드를 입력해야합니다libpq대신 서버에 연결합니다. 기본 프롬프트는 단순히 인쇄합니다.verification_uri
anduser_code
표준 오류에서. 교체 구현은 선호하는 방법 (예 : GUI)을 사용 하여이 정보를 표시 할 수 있습니다.
이 콜백은 내장 장치 인증 흐름 중에만 호출됩니다. 응용 프로그램이 a를 설치하는 경우Custom 토토 핫 흐름,이 authdata 유형은 사용되지 않습니다.
nuln이 아닌 경우verification_uri_complete
가 제공되면 선택적으로 텍스트가 아닌 검증에 사용될 수 있습니다 (예 : QR 코드를 표시 함). 이 경우 URL 및 사용자 코드는 여전히 최종 사용자에게 표시되어야합니다.이 경우 코드가 공급자가 수동으로 확인하고 URL을 사용하면 비 텍스트 방법을 사용할 수없는 경우에도 URL을 계속할 수 있습니다.RFC 8628.
pqauthdata_토토 핫_bearer_token
#전체 OAuth 흐름을 사용자 정의 구현으로 대체합니다. 후크는 현재 사용자/발행자/스코프 조합에 대한 베어러 토큰을 직접 반환하거나 차단하지 않고 사용할 수 있거나 다른 콜백을 설정하여 하나를 검색해야합니다..
데이터
인스턴스를 가리 킵니다pg토토 핫bearerRequest
.
typedef struct pg토토 핫bearerrequest
hook에 두 개의 정보가 제공됩니다libpq: OpenID_Configuration
권한 부여 서버의 지원 흐름을 설명하는 Oauth 발견 문서의 URL을 포함합니다.스코프
서버에 액세스하는 데 필요한 공간 분리 된 OAUTH 스코프 목록이 포함되어 있습니다. 둘 중 하나 또는 둘 다일 수 있습니다NULL
정보가 발견 할 수 없음을 나타냅니다. (이 경우 구현은 다른 미리 구성된 지식을 사용하여 요구 사항을 설정하거나 실패하기로 선택할 수 있습니다.)
후크의 최종 출력은입니다.토큰
, 연결에 사용하기 위해 유효한 베어러 토큰을 가리켜 야합니다. (이 토큰은에 의해 발행되어야합니다.토토 핫_issuer요청 된 스코프를 보관하거나 서버의 유효성 검사기 모듈에 의해 연결이 거부됩니다.) 할당 된 토큰 문자열은까지 유효한 상태로 유지되어야합니다.libpq연결이 완료되었습니다. 후크는 a를 설정해야합니다.정리
libpq더 이상 필요하지 않습니다.
구현이 즉시 a를 생산할 수없는 경우토큰
후크로의 초기 호출 중에를 설정해야합니다.async
13055_13130[16]이것은 후크에서 돌아 오는 즉시 흐름을 시작하도록 호출됩니다. 콜백이 차단하지 않고 더 많은 진전을 이룰 수 없으면 둘 중 하나를 반환해야합니다pgres_polling_reading
또는pgres_polling_writing
설정 후*pgsocket
진행 상황을 다시 만들 수있을 때 읽고 읽을 준비가 된 파일 디스크립터로. (이 설명자는를 통해 최상위 폴링 루프에 제공됩니다pqsocket ()
.) 반환pgres_polling_ok
설정 후토큰
흐름이 완료되면 또는pgres_polling_failed
실패를 나타내려면
구현은 전화에 걸쳐 부기를위한 추가 데이터를 저장할 수 있습니다async
and정리
콜백. 그만큼사용자
포인터 가이 목적을 위해 제공됩니다.libpq내용은 내용을 터치하지 않으며 응용 프로그램은 편의상이를 사용할 수 있습니다. (토큰 청소 중에 할당을 해제해야합니다.)
환경 변수를 설정하여 "위험한 디버깅 모드"를 활성화 할 수 있습니다pg토토 핫debug = 안전하지 않은
. 이 기능은 현지 개발 및 테스트의 용이성 만 제공됩니다.
토토 핫 제공 업체 교환 중에 암호화되지 않은 HTTP의 사용을 허용
시스템의 신뢰할 수있는 CA 목록을를 사용하여 완전히 교체 할 수 있습니다.pg토토 핫cafile
환경 변수
토토 핫 흐름 중에 HTTP 트래픽 (몇 가지 중요한 비밀 포함)을 표준 오류로 인쇄
2 초 레트리 간격을 사용하여 클라이언트가 바쁜 루프를 만들고 무의미하게 CPU를 소비 할 수 있습니다
토토 핫 흐름 트래픽의 출력을 제 3 자와 공유하지 마십시오. 여기에는 고객과 서버를 공격하는 데 사용할 수있는 비밀이 포함되어 있습니다.
[16]pqauthdata_토토 핫_bearer_token
후크 콜백은 |와 같은 비 차단 연결 API를 방해합니다PQConnectPoll
동시 연결이 진행되는 것을 방지합니다. 와 같은 동기 연결 프리미티브 만 사용하는 응용 프로그램PQCONNECTDB
, 후크 중에 토큰을 동기 검색 할 수 있습니다.async
콜백이지만 반드시 한 번에 하나의 연결로 제한됩니다.