mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-01-09 15:17:59 -05:00
We want to provide Single Sign-On for multiple AutoGPT apps that use the Platform as their backend. ### Changes 🏗️ Backend: - DB + logic + API for OAuth flow (w/ tests) - DB schema additions for OAuth apps, codes, and tokens - Token creation/validation/management logic - OAuth flow endpoints (app info, authorize, token exchange, introspect, revoke) - E2E OAuth API integration tests - Other OAuth-related endpoints (upload app logo, list owned apps, external `/me` endpoint) - App logo asset management - Adjust external API middleware to support auth with access token - Expired token clean-up job - Add `OAUTH_TOKEN_CLEANUP_INTERVAL_HOURS` setting (optional) - `poetry run oauth-tool`: dev tool to test the OAuth flows and register new OAuth apps - `poetry run export-api-schema`: dev tool to quickly export the OpenAPI schema (much quicker than spinning up the backend) Frontend: - Frontend UI for app authorization (`/auth/authorize`) - Re-redirect after login/signup - Frontend flow to batch-auth integrations on request of the client app (`/auth/integrations/setup-wizard`) - Debug `CredentialInputs` component - Add `/profile/oauth-apps` management page - Add `isOurProblem` flag to `ErrorCard` to hide action buttons when the error isn't our fault - Add `showTitle` flag to `CredentialsInput` to hide built-in title for layout reasons DX: - Add [API guide](https://github.com/Significant-Gravitas/AutoGPT/blob/pwuts/sso/docs/content/platform/integrating/api-guide.md) and [OAuth guide](https://github.com/Significant-Gravitas/AutoGPT/blob/pwuts/sso/docs/content/platform/integrating/oauth-guide.md) ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] Manually verify test coverage of OAuth API tests - Test `/auth/authorize` using `poetry run oauth-tool test-server` - [x] Works - [x] Looks okay - Test `/auth/integrations/setup-wizard` using `poetry run oauth-tool test-server` - [x] Works - [x] Looks okay - Test `/profile/oauth-apps` page - [x] All owned OAuth apps show up - [x] Enabling/disabling apps works - [ ] ~~Uploading logos works~~ can only test this once deployed to dev #### For configuration changes: - [x] `.env.default` is updated or already compatible with my changes - [x] `docker-compose.yml` is updated or already compatible with my changes - [x] I have included a list of my configuration changes in the PR description (under **Changes**)
97 lines
2.3 KiB
Python
97 lines
2.3 KiB
Python
import enum
|
|
from typing import Any, Literal, Optional
|
|
|
|
import pydantic
|
|
from prisma.enums import OnboardingStep
|
|
|
|
from backend.data.auth.api_key import APIKeyInfo, APIKeyPermission
|
|
from backend.data.graph import Graph
|
|
from backend.util.timezone_name import TimeZoneName
|
|
|
|
|
|
class WSMethod(enum.Enum):
|
|
SUBSCRIBE_GRAPH_EXEC = "subscribe_graph_execution"
|
|
SUBSCRIBE_GRAPH_EXECS = "subscribe_graph_executions"
|
|
UNSUBSCRIBE = "unsubscribe"
|
|
GRAPH_EXECUTION_EVENT = "graph_execution_event"
|
|
NODE_EXECUTION_EVENT = "node_execution_event"
|
|
NOTIFICATION = "notification"
|
|
ERROR = "error"
|
|
HEARTBEAT = "heartbeat"
|
|
|
|
|
|
class WSMessage(pydantic.BaseModel):
|
|
method: WSMethod
|
|
data: Optional[dict[str, Any] | list[Any] | str] = None
|
|
success: bool | None = None
|
|
channel: str | None = None
|
|
error: str | None = None
|
|
|
|
|
|
class WSSubscribeGraphExecutionRequest(pydantic.BaseModel):
|
|
graph_exec_id: str
|
|
|
|
|
|
class WSSubscribeGraphExecutionsRequest(pydantic.BaseModel):
|
|
graph_id: str
|
|
|
|
|
|
GraphCreationSource = Literal["builder", "upload"]
|
|
GraphExecutionSource = Literal["builder", "library", "onboarding"]
|
|
|
|
|
|
class CreateGraph(pydantic.BaseModel):
|
|
graph: Graph
|
|
source: GraphCreationSource | None = None
|
|
|
|
|
|
class CreateAPIKeyRequest(pydantic.BaseModel):
|
|
name: str
|
|
permissions: list[APIKeyPermission]
|
|
description: Optional[str] = None
|
|
|
|
|
|
class CreateAPIKeyResponse(pydantic.BaseModel):
|
|
api_key: APIKeyInfo
|
|
plain_text_key: str
|
|
|
|
|
|
class SetGraphActiveVersion(pydantic.BaseModel):
|
|
active_graph_version: int
|
|
|
|
|
|
class UpdatePermissionsRequest(pydantic.BaseModel):
|
|
permissions: list[APIKeyPermission]
|
|
|
|
|
|
class RequestTopUp(pydantic.BaseModel):
|
|
credit_amount: int
|
|
|
|
|
|
class UploadFileResponse(pydantic.BaseModel):
|
|
file_uri: str
|
|
file_name: str
|
|
size: int
|
|
content_type: str
|
|
expires_in_hours: int
|
|
|
|
|
|
class TimezoneResponse(pydantic.BaseModel):
|
|
# Allow "not-set" as a special value, or any valid IANA timezone
|
|
timezone: TimeZoneName | str
|
|
|
|
|
|
class UpdateTimezoneRequest(pydantic.BaseModel):
|
|
timezone: TimeZoneName
|
|
|
|
|
|
class NotificationPayload(pydantic.BaseModel):
|
|
type: str
|
|
event: str
|
|
|
|
model_config = pydantic.ConfigDict(extra="allow")
|
|
|
|
|
|
class OnboardingNotificationPayload(NotificationPayload):
|
|
step: OnboardingStep | None
|