앱의 최종 사용자 로그인
app-auth 묶음의 오퍼레이션 6 개입니다.
| 메서드 | 경로 | 하는 일 |
|---|---|---|
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/auth | 최종 사용자 인증 상태 (runlot auth) |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/auth | 인증을 켠다 (runlot auth create) |
| PATCH | /v1/orgs/{orgSlug}/projects/{projectName}/auth | 설정을 바꾼다 (runlot auth set) |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/auth | 인증을 해제한다 (runlot auth delete) |
| PUT | /v1/orgs/{orgSlug}/projects/{projectName}/auth/providers/{provider} | 소셜 프로바이더를 등록·교체한다 (runlot auth provider set) |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/auth/providers/{provider} | 프로바이더를 뗀다 (runlot auth provider rm) |
GET /v1/orgs/{orgSlug}/projects/{projectName}/auth
부여 여부·설정·등록된 프로바이더·콜백을 걸 호스트 (docs/auth.md §9).
가입자 표는 여기 없다. 사람은 프로젝트의 Postgres 안 runlot_auth
스키마에 살고 (docs/auth.md §6), CP 는 그 표를 보지 않는다 — 지금 그것을
읽는 길은 워커의 env.auth.users.* 와 runlot pg shell 이다.
providers 에는 client id 만 온다. 클라이언트 시크릿은 봉인돼 있고
어느 응답에도 나가지 않는다 (시크릿 표면의 규칙).
viewer 이상 — "이 앱에 로그인이 있는가" 는 조직의 누구나 알아야 하는 사실이다.
operationId getAuth
| 응답 | 뜻 | 본문 |
|---|---|---|
| 200 | 인증 상태 | AuthStatus |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core — cp-core 연결이 없다 | Error |
POST /v1/orgs/{orgSlug}/projects/{projectName}/auth
멱등이다 — 두 번 불러도 설정과 프로바이더는 그대로다. 부여의 유일한 표현이 행의 존재라 (마이그레이션 0024) "켜졌지만 꺼져 있다" 는 상태는 없다.
데이터베이스가 있어야 한다. 없으면 409 database_required 다 —
가입자 표가 프로젝트 DB 안이라 (docs/auth.md §1) 부여만 세우면 워커가
뜨는 순간 표가 없다. runlot add pg auth 가 pg 를 먼저 부르는 이유가
이것이고, CLI 는 이 409 를 받으면 그 명령을 안내한다.
부여가 서면 노드가 다음 수렴에서 auth 시스템 워커를 소켓의 진입
서비스로 세운다 — 재배포는 필요 없다 (env.db·env.storage 와 같은
길). 표 부트스트랩은 멱등이라 두 번 켜도 한 번이다.
요청 본문이 없다. 설정은 기본값으로 서고 (AuthSettings 의 기본),
바꾸는 것은 PATCH 다.
member 이상. 감사 auth.grant.
operationId grantAuth
| 응답 | 뜻 | 본문 |
|---|---|---|
| 200 | 부여 상태 (이미 있었으면 기존 값) | AuthStatus |
| 403 | — | — |
| 404 | — | — |
| 409 | database_required — 이 프로젝트에 데이터베이스가 없다. runlot pg create 를 먼저 한다. | Error |
| 503 | no_core | Error |
PATCH /v1/orgs/{orgSlug}/projects/{projectName}/auth
부분 갱신이다. 준 칸만 바뀌고 나머지는 그대로다 — 화면이 스위치 하나를 누를 때마다 브랜드 셋을 같이 실어 보내면, 두 사람이 같은 카드를 만질 때 나중 저장이 앞 저장을 덮는다.
부여가 없으면 404 not_granted 다. 설정만 앞서 저장해 두는 자리는
없다 — 부여가 곧 행이고 설정은 그 행의 칸이다.
sessionDays 는 세션 표의 크기를 정하는 손잡이이기도 하다
(docs/auth.md §13 — 150 MB 상한 안에 든다).
member 이상. 감사 auth.settings.
operationId updateAuthSettings
본문 application/json · AuthSettingsPatch
| 응답 | 뜻 | 본문 |
|---|---|---|
| 200 | 바뀐 상태 | AuthStatus |
| 400 | — | — |
| 403 | — | — |
| 404 | not_granted — 이 프로젝트에 인증이 없다. 프로젝트 자체가 없을 때도 같은 코드가 아니라 not_found 다. | Error |
| 503 | no_core | Error |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/auth
가입자는 지워지지 않는다. runlot_auth 의 표는 프로젝트 DB 안에
그대로 남는다 (docs/auth.md §9) — 데이터는 DB 의 것이고, 지우는 것은
runlot pg 의 일이다. 다시 켜면 같은 사람들이 그대로 로그인한다.
다음 수렴부터 auth 시스템 워커가 내려가고 /__runlot/auth/* 는 사용자
워커로 그대로 넘어간다 — 그 경로에 라우트가 없으면 404 다.
해제도 멱등이다: 없는 부여를 떼는 것도 204 다.
admin 이상 — 켜는 것은 member 지만 끄는 것은 로그인한 사람 전부를
내보내는 일이다. 감사 auth.revoke.
operationId revokeAuth
| 응답 | 뜻 | 본문 |
|---|---|---|
| 204 | 뗐다 | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core | Error |
PUT /v1/orgs/{orgSlug}/projects/{projectName}/auth/providers/{provider}
프로젝트가 자기 OAuth 앱을 등록한다. 플랫폼 공용 앱을 두지 않는 이유는 동의 화면·심사·프라이버시가 전부 그 앱 주인의 것이기 때문이다 (docs/auth.md §12).
프로바이더에 등록할 콜백 URL 은 호스트마다
https://<host>/__runlot/auth/callback/<provider> 다. 호스트 목록은
AuthStatus.hosts 에 있다.
clientSecret 은 project_secrets 와 같은 DEK·같은 AAD 로 봉인되고
(이름은 예약 접두 auth/<provider>), 어느 응답에도 다시 나오지
않는다. 교체는 같은 PUT 이다 — 멱등이라 재시도가 안전하다.
admin 이상 — 자격 증명이다. 감사 auth.provider.set (시크릿은 안 남는다).
operationId setAuthProvider
본문 application/json · AuthProviderPut
| 응답 | 뜻 | 본문 |
|---|---|---|
| 200 | 바뀐 상태 | AuthStatus |
| 400 | invalid_provider — github·google·kakao 밖의 이름이거나 clientId·clientSecret 이 비었다. | Error |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core | Error |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/auth/providers/{provider}
그 프로바이더로만 가입한 사람은 로그인할 길을 잃는다 — 사용자 행은
남고 identities 의 그 줄만 없어진다. 다시 등록하면 같은 계정으로
돌아온다.
없는 프로바이더를 떼는 것도 204 다.
admin 이상. 감사 auth.provider.delete.
operationId deleteAuthProvider
| 응답 | 뜻 | 본문 |
|---|---|---|
| 204 | 뗐다 | — |
| 403 | — | — |
| 404 | — | — |
| 503 | no_core | Error |