# `LLMProxy.Providers.OpenAICodex.OAuth.Login`
[🔗](https://github.com/elixir-vibe/llm_proxy/blob/v0.3.1/lib/llm_proxy/providers/openai_codex/oauth/login.ex#L1)

Interactive OpenAI Codex OAuth login for standalone LLMProxy releases.

The browser-facing OAuth protocol returns JSON/string-keyed provider data.
This module owns that external boundary and converts successful token responses
into `LLMProxy.Providers.OpenAICodex.OAuth` credentials for storage.

# `post_fun`

```elixir
@type post_fun() :: (String.t(), keyword() -&gt;
                 {:ok, Req.Response.t()} | {:error, term()})
```

# `account_id`

```elixir
@spec account_id(String.t()) :: String.t() | nil
```

# `authorize_url`

```elixir
@spec authorize_url(String.t(), String.t(), String.t()) :: String.t()
```

# `exchange_code`

```elixir
@spec exchange_code(String.t(), String.t(), post_fun()) ::
  {:ok, LLMProxy.Providers.OpenAICodex.OAuth.t()} | {:error, term()}
```

# `new_state`

```elixir
@spec new_state() :: String.t()
```

# `new_verifier`

```elixir
@spec new_verifier() :: String.t()
```

# `parse_authorization_input`

```elixir
@spec parse_authorization_input(String.t(), String.t()) ::
  {:ok, String.t()} | {:error, term()}
```

# `parse_token_response`

```elixir
@spec parse_token_response(map() | String.t()) ::
  {:ok, LLMProxy.Providers.OpenAICodex.OAuth.t()} | {:error, term()}
```

# `pkce_challenge`

```elixir
@spec pkce_challenge(String.t()) :: String.t()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
