fix login schema (#3017)
This commit is contained in:
@@ -85,6 +85,8 @@ async def login(
|
|||||||
yaml_parameters = []
|
yaml_parameters = []
|
||||||
parameter_key = "credential"
|
parameter_key = "credential"
|
||||||
if login_request.credential_type == CredentialType.skyvern:
|
if login_request.credential_type == CredentialType.skyvern:
|
||||||
|
if not login_request.credential_id:
|
||||||
|
raise HTTPException(status_code=400, detail="credential_id is required to login with Skyvern credential")
|
||||||
credential = await app.DATABASE.get_credential(login_request.credential_id, organization.organization_id)
|
credential = await app.DATABASE.get_credential(login_request.credential_id, organization.organization_id)
|
||||||
if not credential:
|
if not credential:
|
||||||
raise HTTPException(status_code=404, detail=f"Credential {login_request.credential_id} not found")
|
raise HTTPException(status_code=404, detail=f"Credential {login_request.credential_id} not found")
|
||||||
@@ -111,6 +113,14 @@ async def login(
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
elif login_request.credential_type == CredentialType.onepassword:
|
elif login_request.credential_type == CredentialType.onepassword:
|
||||||
|
if not login_request.onepassword_vault_id:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=400, detail="onepassword_vault_id is required to login with 1Password credential"
|
||||||
|
)
|
||||||
|
if not login_request.onepassword_item_id:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=400, detail="onepassword_item_id is required to login with 1Password credential"
|
||||||
|
)
|
||||||
yaml_parameters = [
|
yaml_parameters = [
|
||||||
OnePasswordCredentialParameterYAML(
|
OnePasswordCredentialParameterYAML(
|
||||||
key=parameter_key,
|
key=parameter_key,
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from enum import StrEnum
|
from enum import StrEnum
|
||||||
from typing import Annotated, Literal, Union
|
|
||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
@@ -12,7 +11,8 @@ class CredentialType(StrEnum):
|
|||||||
onepassword = "1password"
|
onepassword = "1password"
|
||||||
|
|
||||||
|
|
||||||
class LoginRequestBase(BaseModel):
|
class LoginRequest(BaseModel):
|
||||||
|
credential_type: CredentialType = Field(..., description="Where to get the credential from")
|
||||||
url: str | None = Field(default=None, description="Website url")
|
url: str | None = Field(default=None, description="Website url")
|
||||||
prompt: str | None = Field(
|
prompt: str | None = Field(
|
||||||
default=None,
|
default=None,
|
||||||
@@ -25,7 +25,9 @@ class LoginRequestBase(BaseModel):
|
|||||||
)
|
)
|
||||||
totp_url: str | None = Field(default=None, description="TOTP URL to fetch one-time passwords")
|
totp_url: str | None = Field(default=None, description="TOTP URL to fetch one-time passwords")
|
||||||
browser_session_id: str | None = Field(
|
browser_session_id: str | None = Field(
|
||||||
default=None, description="ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`"
|
default=None,
|
||||||
|
description="ID of the browser session to use, which is prefixed by `pbs_` e.g. `pbs_123456`",
|
||||||
|
examples=["pbs_123456"],
|
||||||
)
|
)
|
||||||
extra_http_headers: dict[str, str] | None = Field(
|
extra_http_headers: dict[str, str] | None = Field(
|
||||||
default=None, description="Additional HTTP headers to include in requests"
|
default=None, description="Additional HTTP headers to include in requests"
|
||||||
@@ -34,37 +36,18 @@ class LoginRequestBase(BaseModel):
|
|||||||
default=None, description="Maximum number of times to scroll for screenshots"
|
default=None, description="Maximum number of times to scroll for screenshots"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Skyvern credential
|
||||||
|
credential_id: str | None = Field(
|
||||||
|
default=None, description="ID of the Skyvern credential to use for login.", examples=["cred_123"]
|
||||||
|
)
|
||||||
|
|
||||||
class SkyvernLoginRequest(LoginRequestBase):
|
# Bitwarden credential
|
||||||
"""
|
bitwarden_collection_id: str | None = Field(
|
||||||
Login with password saved in Skyvern
|
default=None,
|
||||||
"""
|
description="Bitwarden collection ID. You can find it in the Bitwarden collection URL. e.g. `https://vault.bitwarden.com/vaults/collection_id/items`",
|
||||||
|
)
|
||||||
credential_type: Literal[CredentialType.skyvern] = CredentialType.skyvern
|
|
||||||
credential_id: str = Field(..., description="ID of the Skyvern credential to use for login.")
|
|
||||||
|
|
||||||
|
|
||||||
class BitwardenLoginRequest(LoginRequestBase):
|
|
||||||
"""
|
|
||||||
Login with password saved in Bitwarden
|
|
||||||
"""
|
|
||||||
|
|
||||||
credential_type: Literal[CredentialType.bitwarden] = CredentialType.bitwarden
|
|
||||||
bitwarden_collection_id: str | None = Field(default=None, description="Bitwarden collection ID")
|
|
||||||
bitwarden_item_id: str | None = Field(default=None, description="Bitwarden item ID")
|
bitwarden_item_id: str | None = Field(default=None, description="Bitwarden item ID")
|
||||||
|
|
||||||
|
# 1Password credential
|
||||||
class OnePasswordLoginRequest(LoginRequestBase):
|
onepassword_vault_id: str | None = Field(default=None, description="1Password vault ID")
|
||||||
"""
|
onepassword_item_id: str | None = Field(default=None, description="1Password item ID")
|
||||||
Login with password saved in 1Password
|
|
||||||
"""
|
|
||||||
|
|
||||||
credential_type: Literal[CredentialType.onepassword] = CredentialType.onepassword
|
|
||||||
onepassword_vault_id: str = Field(..., description="1Password vault ID.")
|
|
||||||
onepassword_item_id: str = Field(..., description="1Password item ID.")
|
|
||||||
|
|
||||||
|
|
||||||
LoginRequest = Annotated[
|
|
||||||
Union[SkyvernLoginRequest, BitwardenLoginRequest, OnePasswordLoginRequest],
|
|
||||||
Field(discriminator="credential_type"),
|
|
||||||
]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user