Files
galaxy-game/authsession/api/internal-openapi.yaml
T
2026-04-08 16:23:07 +02:00

457 lines
14 KiB
YAML

openapi: 3.0.3
info:
title: Galaxy Auth / Session Service Internal API
version: v1
description: |
This specification documents the implemented `galaxy/authsession` v1
trusted internal REST contract.
Contract rules:
- the internal surface lives under `/api/v1/internal`;
- all request and response bodies are JSON only;
- read operations return canonical session DTO wrappers;
- mutating operations return explicit `200` JSON acknowledgements;
- mutation requests carry audit metadata as `reason_code` and `actor`;
- `BlockUser` accepts exactly one of `user_id` or `email`;
- `ListUserSessions` is newest-first and unpaginated in v1.
tags:
- name: InternalAuthSession
description: Trusted internal session read, revoke, and block operations.
paths:
/api/v1/internal/sessions/{device_session_id}:
get:
tags:
- InternalAuthSession
operationId: getSession
summary: Read one device session
parameters:
- $ref: "#/components/parameters/DeviceSessionID"
responses:
"200":
description: The requested device session.
content:
application/json:
schema:
$ref: "#/components/schemas/GetSessionResponse"
"404":
$ref: "#/components/responses/SessionNotFoundError"
"500":
$ref: "#/components/responses/InternalError"
"503":
$ref: "#/components/responses/ServiceUnavailableError"
/api/v1/internal/users/{user_id}/sessions:
get:
tags:
- InternalAuthSession
operationId: listUserSessions
summary: List all active and revoked sessions of one user
description: |
Returns the full v1 session list for one user. Results are ordered from
newest to oldest and are intentionally unpaginated in v1.
parameters:
- $ref: "#/components/parameters/UserID"
responses:
"200":
description: |
Sessions belonging to the requested user. Returns an empty array
when the user has no stored sessions, including unknown `user_id`
values.
content:
application/json:
schema:
$ref: "#/components/schemas/ListUserSessionsResponse"
"500":
$ref: "#/components/responses/InternalError"
"503":
$ref: "#/components/responses/ServiceUnavailableError"
/api/v1/internal/sessions/{device_session_id}/revoke:
post:
tags:
- InternalAuthSession
operationId: revokeDeviceSession
summary: Revoke one device session
parameters:
- $ref: "#/components/parameters/DeviceSessionID"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RevokeDeviceSessionRequest"
responses:
"200":
description: Explicit idempotent acknowledgement of the revoke result.
content:
application/json:
schema:
$ref: "#/components/schemas/RevokeDeviceSessionResponse"
"400":
$ref: "#/components/responses/InvalidRequestError"
"404":
$ref: "#/components/responses/SessionNotFoundError"
"500":
$ref: "#/components/responses/InternalError"
"503":
$ref: "#/components/responses/ServiceUnavailableError"
/api/v1/internal/users/{user_id}/sessions/revoke-all:
post:
tags:
- InternalAuthSession
operationId: revokeAllUserSessions
summary: Revoke all sessions of one user
parameters:
- $ref: "#/components/parameters/UserID"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RevokeAllUserSessionsRequest"
responses:
"200":
description: Explicit idempotent acknowledgement of the bulk revoke result.
content:
application/json:
schema:
$ref: "#/components/schemas/RevokeAllUserSessionsResponse"
"400":
$ref: "#/components/responses/InvalidRequestError"
"404":
$ref: "#/components/responses/SubjectNotFoundError"
"500":
$ref: "#/components/responses/InternalError"
"503":
$ref: "#/components/responses/ServiceUnavailableError"
/api/v1/internal/user-blocks:
post:
tags:
- InternalAuthSession
operationId: blockUser
summary: Block future auth flow for one subject and revoke active sessions
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/BlockUserRequest"
responses:
"200":
description: Explicit idempotent acknowledgement of the block result.
content:
application/json:
schema:
$ref: "#/components/schemas/BlockUserResponse"
"400":
$ref: "#/components/responses/InvalidRequestError"
"404":
$ref: "#/components/responses/SubjectNotFoundError"
"500":
$ref: "#/components/responses/InternalError"
"503":
$ref: "#/components/responses/ServiceUnavailableError"
components:
parameters:
DeviceSessionID:
name: device_session_id
in: path
required: true
description: Stable identifier of one device session.
schema:
type: string
UserID:
name: user_id
in: path
required: true
description: Stable identifier of one user.
schema:
type: string
schemas:
Actor:
type: object
additionalProperties: false
required:
- type
properties:
type:
type: string
description: Machine-readable actor type such as `system`, `service`, or `admin`.
id:
type: string
description: Optional stable identifier of the initiating actor.
ErrorResponse:
type: object
additionalProperties: false
required:
- error
properties:
error:
$ref: "#/components/schemas/ErrorBody"
ErrorBody:
type: object
additionalProperties: false
required:
- code
- message
properties:
code:
type: string
description: Stable internal API error code.
message:
type: string
description: Human-readable error description safe for trusted internal callers.
Session:
type: object
additionalProperties: false
required:
- device_session_id
- user_id
- client_public_key
- status
- created_at
properties:
device_session_id:
type: string
user_id:
type: string
client_public_key:
type: string
description: Standard base64-encoded raw 32-byte Ed25519 public key of the device session.
status:
type: string
enum:
- active
- revoked
created_at:
type: string
format: date-time
description: RFC3339 UTC timestamp when the session was created.
revoked_at:
type: string
format: date-time
nullable: true
description: RFC3339 UTC timestamp when the session was revoked.
revoke_reason_code:
type: string
nullable: true
description: Machine-readable revoke reason code when the session is revoked.
revoke_actor_type:
type: string
nullable: true
description: Actor type that initiated the revoke.
revoke_actor_id:
type: string
nullable: true
description: Optional stable actor identifier that initiated the revoke.
GetSessionResponse:
type: object
additionalProperties: false
required:
- session
properties:
session:
$ref: "#/components/schemas/Session"
ListUserSessionsResponse:
type: object
additionalProperties: false
required:
- sessions
properties:
sessions:
type: array
description: Full newest-first session list for the requested user.
items:
$ref: "#/components/schemas/Session"
RevokeDeviceSessionRequest:
type: object
additionalProperties: false
required:
- reason_code
- actor
properties:
reason_code:
type: string
description: Machine-readable revoke reason code.
actor:
$ref: "#/components/schemas/Actor"
RevokeDeviceSessionResponse:
type: object
additionalProperties: false
required:
- outcome
- device_session_id
- affected_session_count
properties:
outcome:
type: string
enum:
- revoked
- already_revoked
device_session_id:
type: string
affected_session_count:
type: integer
format: int64
minimum: 0
RevokeAllUserSessionsRequest:
type: object
additionalProperties: false
required:
- reason_code
- actor
properties:
reason_code:
type: string
description: Machine-readable bulk revoke reason code.
actor:
$ref: "#/components/schemas/Actor"
RevokeAllUserSessionsResponse:
type: object
additionalProperties: false
required:
- outcome
- user_id
- affected_session_count
- affected_device_session_ids
properties:
outcome:
type: string
enum:
- revoked
- no_active_sessions
user_id:
type: string
affected_session_count:
type: integer
format: int64
minimum: 0
affected_device_session_ids:
type: array
items:
type: string
BlockUserRequest:
oneOf:
- $ref: "#/components/schemas/BlockUserByUserIDRequest"
- $ref: "#/components/schemas/BlockUserByEmailRequest"
BlockUserByUserIDRequest:
type: object
additionalProperties: false
required:
- user_id
- reason_code
- actor
properties:
user_id:
type: string
reason_code:
type: string
description: Machine-readable block reason code.
actor:
$ref: "#/components/schemas/Actor"
BlockUserByEmailRequest:
type: object
additionalProperties: false
required:
- email
- reason_code
- actor
properties:
email:
type: string
format: email
reason_code:
type: string
description: Machine-readable block reason code.
actor:
$ref: "#/components/schemas/Actor"
BlockUserResponse:
type: object
additionalProperties: false
required:
- outcome
- subject_kind
- subject_value
- affected_session_count
- affected_device_session_ids
properties:
outcome:
type: string
enum:
- blocked
- already_blocked
subject_kind:
type: string
enum:
- user_id
- email
subject_value:
type: string
affected_session_count:
type: integer
format: int64
minimum: 0
affected_device_session_ids:
type: array
items:
type: string
responses:
InvalidRequestError:
description: Request path, parameters, or body fields are invalid.
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
invalidRequest:
value:
error:
code: invalid_request
message: reason_code must not be empty
SessionNotFoundError:
description: The referenced device session does not exist.
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
sessionNotFound:
value:
error:
code: session_not_found
message: session not found
SubjectNotFoundError:
description: The referenced internal block or bulk-revoke subject does not exist.
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
subjectNotFound:
value:
error:
code: subject_not_found
message: subject not found
ServiceUnavailableError:
description: A required dependency is temporarily unavailable.
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
unavailable:
value:
error:
code: service_unavailable
message: service is unavailable
InternalError:
description: Unexpected internal failure while processing the request.
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
examples:
internal:
value:
error:
code: internal_error
message: internal server error