Documentation
¶
Index ¶
- Constants
- func AssignRole(db *orm.DB, rbacSvc *rbac.Service) router.HandlerFunc
- func Health() router.HandlerFunc
- func HealthDB(db *orm.DB) router.HandlerFunc
- func Register(r router.Router, db *orm.DB, authMod *authority.Module, rbacSvc *rbac.Service, ...)
- func ResolveUser(db *orm.DB, authMod *authority.Module) router.HandlerFunc
- func Token(db *orm.DB, authMod *authority.Module, rbacSvc *rbac.Service, secret []byte) router.HandlerFunc
- type AssignRoleRequest
- type AssignRoleResponse
- type ResolveUserRequest
- type ResolveUserResponse
- type TokenRequest
- type TokenResponse
Constants ¶
const BindingD1 = api.BindingD1
const PathHealth = api.PathHealth
const PathHealthDB = api.PathHealthDB
const PathRolesAssign = api.PathRolesAssign
const PathToken = api.PathToken
const PathUsersResolve = api.PathUsersResolve
Variables ¶
This section is empty.
Functions ¶
func AssignRole ¶ added in v0.0.21
AssignRole concede roleCode al usuario en el proyecto del llamante. Idempotente: si ya lo tiene, no es un error. Si el rol no existe en ese proyecto, se crea.
func Health ¶
func Health() router.HandlerFunc
Health responde si este Worker esta vivo y sirviendo. A proposito NO toca la base: quien consulta esta ruta pregunta por el Worker, y meter una consulta a D1 aqui costaba ~160 ms de viaje a la region de la base ademas de convertir un hipo de red en una falsa alarma de caida. La alcanzabilidad de la base tiene su propia ruta, PathHealthDB.
func HealthDB ¶ added in v0.0.20
func HealthDB(db *orm.DB) router.HandlerFunc
HealthDB comprueba que la base responde. Es deliberadamente una ruta aparte: cuesta un viaje completo a la region donde vive D1, asi que se consulta cuando se quiere esa respuesta, no en cada latido de un monitor.
func Register ¶
func Register(r router.Router, db *orm.DB, authMod *authority.Module, rbacSvc *rbac.Service, secret []byte)
Register monta todas las rutas de iam en el router.
modules is the single, exhaustive list of everything this server mounts through router.APIModule. It is intentionally the ONLY place iam calls MountAPI: a module with routes to serve belongs in this slice, never invoked ad hoc elsewhere, so adding a module here is the only way its routes reach a caller — and leaving it out is the only way they don't. That is what closes the hole this plan exists for: authMod's OAuth routes (/oauth/google, /oauth/callback/google) and /logout were built and enabled (config/auth.go, config/auth_local.go) but never mounted, so every login attempt 404'd, silently, since Stage 4 — MountAPI existed and was correct, nothing ever called it.
Ninguna ruta lleva CORS: el llamador es siempre el SERVIDOR de un proyecto consumidor (server-to-server), nunca el navegador del usuario directamente — el client_secret no puede vivir en un bundle WASM/JS (ver ARCHITECTURE.md §6.4/§7). Sin llamador cross-origin, no hay cabeceras CORS que emitir.
func ResolveUser ¶ added in v0.0.9
ResolveUser busca un usuario por email dentro de la identidad global de iam (no hay tabla de usuarios por proyecto: la identidad es una sola, ver ARCHITECTURE.md §1) y lo crea si no existe. Devuelve su Sub — el mismo id que llevará el Sub de su token cuando inicie sesión, así que un consumidor puede asignarle recursos (ej. dueño de un sitio) ANTES de que esa persona haga login por primera vez.
Types ¶
type AssignRoleRequest ¶ added in v0.0.21
type AssignRoleRequest struct {
ProjectID string
ClientSecret string
UserID string
RoleCode string
}
AssignRoleRequest es el cuerpo de POST /api/roles/assign. Acotado al project_id del que llama: un consumidor jamás concede un rol en otro proyecto.
func (*AssignRoleRequest) DecodeFields ¶ added in v0.0.21
func (r *AssignRoleRequest) DecodeFields(fr model.FieldReader)
func (*AssignRoleRequest) EncodeFields ¶ added in v0.0.21
func (r *AssignRoleRequest) EncodeFields(w model.FieldWriter)
func (*AssignRoleRequest) IsNil ¶ added in v0.0.21
func (r *AssignRoleRequest) IsNil() bool
type AssignRoleResponse ¶ added in v0.0.21
type AssignRoleResponse struct{}
func (*AssignRoleResponse) DecodeFields ¶ added in v0.0.21
func (r *AssignRoleResponse) DecodeFields(fr model.FieldReader)
func (*AssignRoleResponse) EncodeFields ¶ added in v0.0.21
func (r *AssignRoleResponse) EncodeFields(w model.FieldWriter)
func (*AssignRoleResponse) IsNil ¶ added in v0.0.21
func (r *AssignRoleResponse) IsNil() bool
type ResolveUserRequest ¶ added in v0.0.9
ResolveUserRequest es el cuerpo de POST /api/users/resolve. No hay sesión de por medio — a diferencia de /api/token, el email de destino no tiene por qué haber iniciado sesión nunca (un admin de un consumidor registra un cliente nuevo por su email). client_secret es la única prueba de identidad: sin él, cualquiera podría crear usuarios en cualquier proyecto.
func (*ResolveUserRequest) DecodeFields ¶ added in v0.0.9
func (r *ResolveUserRequest) DecodeFields(fr model.FieldReader)
func (*ResolveUserRequest) EncodeFields ¶ added in v0.0.9
func (r *ResolveUserRequest) EncodeFields(w model.FieldWriter)
func (*ResolveUserRequest) IsNil ¶ added in v0.0.9
func (r *ResolveUserRequest) IsNil() bool
type ResolveUserResponse ¶ added in v0.0.9
type ResolveUserResponse struct {
Sub string
}
ResolveUserResponse es la respuesta de POST /api/users/resolve.
func (*ResolveUserResponse) DecodeFields ¶ added in v0.0.9
func (r *ResolveUserResponse) DecodeFields(fr model.FieldReader)
func (*ResolveUserResponse) EncodeFields ¶ added in v0.0.9
func (r *ResolveUserResponse) EncodeFields(w model.FieldWriter)
func (*ResolveUserResponse) IsNil ¶ added in v0.0.9
func (r *ResolveUserResponse) IsNil() bool
type TokenRequest ¶
TokenRequest es el cuerpo de POST /api/token. userID NUNCA viaja aquí — sale de ctx.UserID() (la sesión activa), nunca del body (ver ARCHITECTURE.md §6, "el userID sale de la sesión, nunca del cuerpo").
func (*TokenRequest) DecodeFields ¶
func (t *TokenRequest) DecodeFields(r model.FieldReader)
func (*TokenRequest) EncodeFields ¶
func (t *TokenRequest) EncodeFields(w model.FieldWriter)
func (*TokenRequest) IsNil ¶
func (t *TokenRequest) IsNil() bool
type TokenResponse ¶
TokenResponse es la respuesta de POST /api/token. Además del token de autorización, lleva el perfil básico del usuario de la sesión — Email/Name/Avatar, no Sub/Aud/Scope (eso vive en Token, ver ARCHITECTURE.md §6.2) — para que un consumidor que ya está haciendo esta llamada no necesite una segunda solo para mostrar "Hola, <nombre>": la respuesta ya requiere sesión activa + client_secret válido, así que no hay superficie nueva que exponer.
func (*TokenResponse) DecodeFields ¶
func (t *TokenResponse) DecodeFields(r model.FieldReader)
func (*TokenResponse) EncodeFields ¶
func (t *TokenResponse) EncodeFields(w model.FieldWriter)
func (*TokenResponse) IsNil ¶
func (t *TokenResponse) IsNil() bool