mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-02 04:20:50 +08:00
feat(oauth): add support for customizable OAuth callback ports - Introduced `oauth-callback-port` flag to override default callback ports. - Updated SDK and login flows for `iflow`, `gemini`, `antigravity`, `codex`, `claude`, and `openai` to respect configurable callback ports. - Refactored internal OAuth servers to dynamically assign ports based on the provided options. - Revised tests and documentation to reflect the new flag and behavior.
74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/auth/codex"
|
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/config"
|
|
sdkAuth "github.com/router-for-me/CLIProxyAPI/v6/sdk/auth"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// LoginOptions contains options for the login processes.
|
|
// It provides configuration for authentication flows including browser behavior
|
|
// and interactive prompting capabilities.
|
|
type LoginOptions struct {
|
|
// NoBrowser indicates whether to skip opening the browser automatically.
|
|
NoBrowser bool
|
|
|
|
// CallbackPort overrides the local OAuth callback port when set (>0).
|
|
CallbackPort int
|
|
|
|
// Prompt allows the caller to provide interactive input when needed.
|
|
Prompt func(prompt string) (string, error)
|
|
}
|
|
|
|
// DoCodexLogin triggers the Codex OAuth flow through the shared authentication manager.
|
|
// It initiates the OAuth authentication process for OpenAI Codex services and saves
|
|
// the authentication tokens to the configured auth directory.
|
|
//
|
|
// Parameters:
|
|
// - cfg: The application configuration
|
|
// - options: Login options including browser behavior and prompts
|
|
func DoCodexLogin(cfg *config.Config, options *LoginOptions) {
|
|
if options == nil {
|
|
options = &LoginOptions{}
|
|
}
|
|
|
|
promptFn := options.Prompt
|
|
if promptFn == nil {
|
|
promptFn = defaultProjectPrompt()
|
|
}
|
|
|
|
manager := newAuthManager()
|
|
|
|
authOpts := &sdkAuth.LoginOptions{
|
|
NoBrowser: options.NoBrowser,
|
|
CallbackPort: options.CallbackPort,
|
|
Metadata: map[string]string{},
|
|
Prompt: promptFn,
|
|
}
|
|
|
|
_, savedPath, err := manager.Login(context.Background(), "codex", cfg, authOpts)
|
|
if err != nil {
|
|
var authErr *codex.AuthenticationError
|
|
if errors.As(err, &authErr) {
|
|
log.Error(codex.GetUserFriendlyMessage(authErr))
|
|
if authErr.Type == codex.ErrPortInUse.Type {
|
|
os.Exit(codex.ErrPortInUse.Code)
|
|
}
|
|
return
|
|
}
|
|
fmt.Printf("Codex authentication failed: %v\n", err)
|
|
return
|
|
}
|
|
|
|
if savedPath != "" {
|
|
fmt.Printf("Authentication saved to %s\n", savedPath)
|
|
}
|
|
fmt.Println("Codex authentication successful!")
|
|
}
|