- шаг схемы закрывает поверхность, которую хранилище приносит открытой: собственную регистрацию, вход по паролю и одноразовый код — без этого закрытие приёма обходилось двумя запросами - продление сессии выключено, срок семь суток: иначе отзыв доступа у провайдера до сервиса не доходит никогда - файл записи отдаётся вошедшему по токену файла — пересмотр ADR-2026-08-12-file-link-open-but-not-logged
62 lines
2.6 KiB
Go
62 lines
2.6 KiB
Go
package pocketbase
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/pocketbase/pocketbase/core"
|
|
)
|
|
|
|
// ProviderName — имя провайдера у коллекции пользователей. Библиотека знает его
|
|
// как обобщённый OIDC и по нему же ищет настройку при обмене кода.
|
|
const ProviderName = "oidc"
|
|
|
|
// ProviderSettings — то, что приезжает из конфига и приводится к настройкам
|
|
// коллекции.
|
|
type ProviderSettings struct {
|
|
AuthURL string
|
|
TokenURL string
|
|
UserInfoURL string
|
|
ClientID string
|
|
ClientSecret string
|
|
}
|
|
|
|
// ApplyProviderSettings приводит настройки провайдера у коллекции пользователей
|
|
// к значениям конфига.
|
|
//
|
|
// Делается это при каждом подъёме, а не однажды шагом схемы, и причина в
|
|
// инварианте: применённый шаг не переписывается. Секрет, положенный шагом, не
|
|
// пережил бы ротации — смена значения в конфиге до хранилища не доехала бы
|
|
// вовсе, и вход сломался бы после смены ключа, а починить это можно было бы
|
|
// только руками в панели.
|
|
//
|
|
// Секрет здесь не логируется и в текст ошибки не попадает: сообщение называет
|
|
// имя коллекции, а не значения.
|
|
func ApplyProviderSettings(app core.App, settings ProviderSettings) error {
|
|
users, err := app.FindCollectionByNameOrId("users")
|
|
if err != nil {
|
|
return fmt.Errorf("failed to find users collection: %w", err)
|
|
}
|
|
|
|
// Срок жизни сессии живёт здесь, а не в шаге схемы: применённый шаг не
|
|
// переписывается, и правка числа не доехала бы до хранилища, разойдясь со
|
|
// сроком жизни куки.
|
|
users.AuthToken.Duration = SessionDuration
|
|
|
|
users.OAuth2.Enabled = true
|
|
users.OAuth2.Providers = []core.OAuth2ProviderConfig{{
|
|
Name: ProviderName,
|
|
ClientId: settings.ClientID,
|
|
ClientSecret: settings.ClientSecret,
|
|
AuthURL: settings.AuthURL,
|
|
TokenURL: settings.TokenURL,
|
|
UserInfoURL: settings.UserInfoURL,
|
|
DisplayName: "Authelia",
|
|
}}
|
|
|
|
if err := app.Save(users); err != nil {
|
|
return fmt.Errorf("failed to apply provider settings to users collection: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|