Documentation
¶
Overview ¶
Package loginlanehttp — HTTP-слушатель полосы формы: четыре глагола Р2 на адресе консоли, ретранслируемые краем (фаза Ф3, задача PRO-Robotech/kacho#1269; приёмка `docs/engineering/acceptance/login-lane-issues-our-session-and-logout-ends-it-server-side.md`, решения Р2, Р3, Р10, Р12, Р16), пятый — регистрация (фаза Ф4, PRO-Robotech/kacho#1270): та же форма ответа, то же печенье, свой вид признака формы и ОДИН отказ на занятость и потолок темпа (Ф4 Р3), — и два глагола восстановления доступа на той же полосе (фаза Ф5, задача PRO-Robotech/kacho#1271; приёмка `docs/engineering/acceptance/recovery-of-access.md`): запрос кода и его предъявление с новым паролем, — и шесть глаголов второго фактора (фаза Ф12, задача PRO-Robotech/kacho#1281; приёмка `docs/engineering/acceptance/second-factor-totp-and-recovery-codes.md`, Р4): заведение, подтверждение, снятие, перечеканка запасных кодов, чтение состояния и церемония повышения внутри сессии; форма входа при этом несёт необязательное поле `secondFactor`. Три глагола своих сессий (задача PRO-Robotech/kaname#634; приёмка `docs/engineering/acceptance/own-sessions-are-listed-and-ended-by-their-owner.md`, Р1…Р10): перечень своих живых сессий, выход из выбранной и из всех, кроме текущей, — субъект из носителя, ответ синхронный.
Кто вправе звать — РОВНО край, и это судится здесь, до тела запроса ¶
Слушатель взаимный по TLS (режим `mutual` — транспорт), и множество допущенных равно краю: короткое имя службы, разобранное из SAN проверенного клиентского сертификата под доменом доверия установки, равно имени края — той же константе и тем же разбором, что у яруса gateway-only внутреннего слушателя (`authzguard.GatewayServiceName`, `authzguard.PeerIsGateway`); краем признаётся только объявленная установкой пара (kaname#984). Круг законных отправителей слушатель НЕ читает: он шире края by construction (§1.10). Пир с иным именем — `PERMISSION_DENIED` / 403 текстом `permission denied`, тело не читается, заголовки в счёт не попадают. Dev-послабления нет: слушатель наружный по построению.
Переданная личность НЕ читается ¶
На этой поверхности личность производит ОДИН механизм — носитель, судимый службой по записи (Р16, KAN-SOLE-01). Заголовков `x-kacho-*` слушатель не читает вовсе — ни в голой, ни в мостовой форме: пары извлечения переданной личности здесь нет, и субъект берётся из `kaname_session`.
Отказы — `google.rpc.Status` JSON, тексты фиксированы ¶
Форма — та, что отдаёт край через grpc-gateway (`{code, message, details}`), `details` — всегда массив (пустой либо с `ErrorInfo`): побайтовое равенство двух отказов (Ф3-02, Ф3-18) держится тем, что тело собирается одной функцией из закрытого набора полей.
Index ¶
Constants ¶
const ( PathLogin = "/iam/v1/auth/login" PathLogout = "/iam/v1/auth/logout" // #nosec G101 -- это ПУТЬ глагола смены пароля, а не значение пароля. PathPassword = "/iam/v1/auth/password" PathCSRF = "/iam/v1/auth/csrf" // PathRegister — регистрация паролем (Ф4): подпутём, как остальные. PathRegister = "/iam/v1/auth/register" // Восстановление доступа (Ф5): запрос кода и его предъявление с новым // паролем — два глагола, две формы, два вида признака. PathRecovery = "/iam/v1/auth/recovery" PathRecoveryComplete = "/iam/v1/auth/recovery/complete" // Второй фактор (Ф12 Р4): четыре глагола семейства подпутями, чтение // состояния на корне семейства, церемония повышения — своим подпутём. PathSecondFactor = "/iam/v1/auth/second-factor" PathSecondFactorEnroll = "/iam/v1/auth/second-factor/enroll" PathSecondFactorConfirm = "/iam/v1/auth/second-factor/confirm" PathSecondFactorRemove = "/iam/v1/auth/second-factor/remove" PathSecondFactorBackupCodes = "/iam/v1/auth/second-factor/backup-codes" PathStepUp = "/iam/v1/auth/step-up" // PathStepUpAccessKeyBegin — выдача испытания повышения ключом доступа под // живой сессией (kaname#827, приёмка SUA Р2): подпуть церемонии. PathStepUpAccessKeyBegin = "/iam/v1/auth/step-up/access-key/begin" // Подтверждение адреса (kaname#456, Р6; имена ратифицированы — Ф6 Р15): // запрос письма и предъявление кода — два глагола под сессией человека. PathVerifyEmail = "/iam/v1/auth/verify-email" PathVerifyEmailConfirm = "/iam/v1/auth/verify-email/confirm" // Вход ключом доступа (Ф13 Р1, kaname#613): выдача испытания и // предъявление утверждения — два глагола, два вида признака формы. PathAccessKeyBegin = "/iam/v1/auth/access-key/begin" PathAccessKeyLogin = "/iam/v1/auth/access-key/login" // PathPasswordEnroll — заведение первого пароля из живой сессии // (kaname#213, приёмка A7 Р1): подпуть семейства пароля. // #nosec G101 -- это ПУТЬ глагола, а не значение пароля. PathPasswordEnroll = "/iam/v1/auth/password/enroll" // Смена адреса почты (kaname#635, приёмка email-change Р1): запрос смены // и предъявление кода с нового адреса — два глагола под сессией человека. PathEmailChange = "/iam/v1/auth/email-change" PathEmailChangeConfirm = "/iam/v1/auth/email-change/confirm" // Свои сессии (kaname#634, Р1): перечень на корне семейства, два снимающих // глагола подпутями. PathSessions = "/iam/v1/auth/sessions" PathSessionsEnd = "/iam/v1/auth/sessions/end" PathSessionsEndOthers = "/iam/v1/auth/sessions/end-others" )
Пути семейства — точное совпадение (Р2). «Кто я» — маршрут КРАЯ, здесь его нет намеренно.
const ( CookieSession = "kaname_session" CookieForm = "kaname_form" )
Имена печений (Р3). Имя носителя отлично от имени носителя поставщика (F4d-26) — перечень гасимых имён у края читает и это имя.
const HeaderForwardedFor = "X-Forwarded-For"
HeaderForwardedFor — заголовок адреса источника у допущенного вызывающего: ОДИН адрес, выведенный краем (Р2, Р10).
const HeaderUserAgent = "User-Agent"
HeaderUserAgent — описание клиента, как его доставил край (kaname#634, Р3). Читается ровно выдающими глаголами — его значение идёт только в запись выдаваемой сессии, — и служба его не разбирает и не толкует.
const TextMethodNotAllowed = methodrefusal.Text
TextMethodNotAllowed — текст отказа на неверный метод: дословно тот, которым отвечает REST-фронт службы (решение R36 п. 3).
const TextPermissionDenied = "permission denied"
TextPermissionDenied — текст отказа пиру, который не край: дословно тот, которым отказывает ярус gateway-only.
Variables ¶
This section is empty.
Functions ¶
func PathPositions ¶
func PathPositions() map[string]PathPosition
PathPositions — объявление Р2 копией.
func Paths ¶
func Paths() []string
Paths — двадцать четыре глагола полосы. Регистрации в New объявляют то же множество второй раз; равенство двух объявлений держит проба TestLaneServesExactlyItsDeclaredPaths (kaname#280): путь только здесь — 404 слушателя, путь только в New — обслуживается мимо перечня. Край платформы этот перечень кодом не читает (internal/ из другого модуля не импортируется): он держит своё объявление и переносит пути правкой.
func ResponseObjectKeys ¶
ResponseObjectKeys — ключи объектов тела ответа полосы по имени объекта, снятые с САМИХ производителей тел, а не выписанные: клиентская страница сверяет с ними ключи своих примеров (kaname#247), и второй перечень разошёлся бы с производителем молча — ровно так пример пережил снятое поле.
Types ¶
type Config ¶
type Config struct {
SessionTTL time.Duration
CookieDomain string
TrustDomain grpcsrv.TrustDomain
// Modules — личности модулей установки (kaname#984): краем признаётся
// только объявленная пара, чья служба — край.
Modules moduleidentity.Roster
RefusalDomain string
Logger *slog.Logger
Observer humansession.Observer
// Verification — клетки отказов положения на путях полосы (kaname#456,
// П13); nil — не считаются.
Verification humansession.AddressVerificationObserver
}
Config — настройка слушателя. Срок и домен — величины профиля (Р3): срок без умолчания; домен — имя либо пусто на адресной посадке («нет» разбирает настройка, сюда приходит уже пустая строка).
type Handler ¶
type Handler struct {
// contains filtered or unexported fields
}
Handler — слушатель полосы формы.
type Lane ¶
type Lane interface {
Login(ctx context.Context, in humansession.LoginInput) (humansession.LoginOutput, error)
Logout(ctx context.Context, bearer domain.SessionBearer) (bool, error)
ChangePassword(ctx context.Context, in humansession.ChangePasswordInput) (humansession.ChangePasswordOutput, error)
// Register — регистрация паролем (Ф4): три следствия одним исходом.
Register(ctx context.Context, in registration.Input) (registration.Output, error)
// RequestRecovery — запрос кода (Ф5-01/02): исход наружу не выходит.
RequestRecovery(ctx context.Context, in humansession.RequestRecoveryInput) error
// CompleteRecovery — предъявление кода с новым паролем (Ф5-03): выдаёт
// сессию, как вход.
CompleteRecovery(ctx context.Context, in humansession.CompleteRecoveryInput) (humansession.CompleteRecoveryOutput, error)
// Второй фактор (Ф12 Р4): шесть глаголов под сессией носителя.
EnrollSecondFactor(ctx context.Context, in humansession.EnrollInput) (humansession.EnrollOutput, error)
ConfirmSecondFactor(ctx context.Context, in humansession.ConfirmInput) (humansession.ConfirmOutput, error)
SecondFactorStatus(ctx context.Context, in humansession.StatusInput) (humansession.StatusOutput, error)
RemoveSecondFactor(ctx context.Context, in humansession.RemoveSecondFactorInput) (humansession.RemoveSecondFactorOutput, error)
RegenerateBackupCodes(ctx context.Context, in humansession.RegenerateBackupCodesInput) (humansession.RegenerateBackupCodesOutput, error)
StepUp(ctx context.Context, in humansession.StepUpInput) (humansession.StepUpOutput, error)
// BeginStepUpAccessKey — выдача испытания повышения ключом под сессией
// носителя (kaname#827, Р2).
BeginStepUpAccessKey(ctx context.Context, in humansession.StepUpAccessKeyBeginInput) (humansession.StepUpAccessKeyBeginOutput, error)
// Подтверждение адреса (kaname#456, Р6): запрос письма и предъявление кода.
RequestEmailVerification(ctx context.Context, bearer domain.SessionBearer) (humansession.RequestVerificationOutput, error)
ConfirmEmailVerification(ctx context.Context, in humansession.ConfirmVerificationInput) (humansession.ConfirmVerificationOutput, error)
// AddressPosition — положение сессии носителя по ТЕКУЩЕЙ отметке (Р1):
// его спрашивает отказ положения на путях, объявленных отказом Р2.
AddressPosition(ctx context.Context, bearer domain.SessionBearer) (humansession.Position, error)
// Вход ключом доступа (Ф13 Р1): испытание выдаётся, не назвав человека;
// предъявление утверждения выдаёт сессию той же формой ответа, что вход
// паролем.
BeginAccessKeyLogin(ctx context.Context, in humansession.BeginAccessKeyLoginInput) (humansession.BeginAccessKeyLoginOutput, error)
AccessKeyLogin(ctx context.Context, in humansession.AccessKeyLoginInput) (humansession.LoginOutput, error)
// EnrollPassword — заведение первого пароля из живой сессии (kaname#213).
EnrollPassword(ctx context.Context, in humansession.EnrollPasswordInput) (humansession.EnrollPasswordOutput, error)
// Смена адреса почты (kaname#635, Р1): запрос смены и предъявление кода.
RequestEmailChange(ctx context.Context, in humansession.RequestEmailChangeInput) (humansession.RequestEmailChangeOutput, error)
ConfirmEmailChange(ctx context.Context, in humansession.ConfirmEmailChangeInput) (humansession.ConfirmEmailChangeOutput, error)
// Свои сессии (kaname#634): перечень, выход из выбранной и из всех, кроме
// текущей.
ListOwnSessions(ctx context.Context, in humansession.ListOwnSessionsInput) (humansession.ListOwnSessionsOutput, error)
EndOwnSession(ctx context.Context, in humansession.EndOwnSessionInput) (humansession.EndOwnSessionOutput, error)
EndOtherOwnSessions(ctx context.Context, in humansession.EndOtherOwnSessionsInput) (humansession.EndOtherOwnSessionsOutput, error)
}
Lane — глаголы полосы (порт над вариантами использования).
type PathPosition ¶
type PathPosition int
PathPosition — что путь полосы делает в ПОЛОЖЕНИИ ПОДТВЕРЖДЕНИЯ (kaname#456, Р2). Перечень строк закрыт; нулевое значение — «не объявлено», и путь без объявления есть находка гейта, а не умолчание в любую сторону.
const ( // PathAvailableInVerification — доступно в положении подтверждения. PathAvailableInVerification PathPosition = iota + 1 // PathRefusedInVerification — отказ положения (Р3). PathRefusedInVerification )