Current section
Files
Jump to
Current section
Files
lib/codex/oauth/provider/openai.ex
defmodule Codex.OAuth.Provider.OpenAI do
@moduledoc false
@default_client_id "app_EMoamEEZ73f0CkXaXp7hrann"
@default_scope "openid profile email offline_access api.connectors.read api.connectors.invoke"
@default_originator "codex_cli_rs"
@enforce_keys [
:issuer,
:client_id,
:authorize_url,
:token_url,
:device_authorization_url,
:device_token_url,
:device_verification_url,
:scope,
:originator
]
defstruct [
:issuer,
:client_id,
:authorize_url,
:token_url,
:device_authorization_url,
:device_token_url,
:device_verification_url,
:scope,
:originator
]
@type t :: %__MODULE__{
issuer: String.t(),
client_id: String.t(),
authorize_url: String.t(),
token_url: String.t(),
device_authorization_url: String.t(),
device_token_url: String.t(),
device_verification_url: String.t(),
scope: String.t(),
originator: String.t()
}
@spec default_issuer() :: String.t()
def default_issuer, do: "https://auth.openai.com"
@spec build(keyword()) :: t()
def build(opts \\ []) when is_list(opts) do
issuer =
opts
|> Keyword.get(:issuer, default_issuer())
|> String.trim_trailing("/")
client_id = Keyword.get(opts, :client_id, @default_client_id)
%__MODULE__{
issuer: issuer,
client_id: client_id,
authorize_url: Keyword.get(opts, :authorize_url, issuer <> "/oauth/authorize"),
token_url: Keyword.get(opts, :token_url, issuer <> "/oauth/token"),
device_authorization_url:
Keyword.get(
opts,
:device_authorization_url,
issuer <> "/api/accounts/deviceauth/usercode"
),
device_token_url:
Keyword.get(opts, :device_token_url, issuer <> "/api/accounts/deviceauth/token"),
device_verification_url:
Keyword.get(opts, :device_verification_url, issuer <> "/codex/device"),
scope: Keyword.get(opts, :scope, @default_scope),
originator: Keyword.get(opts, :originator, @default_originator)
}
end
end