mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 13:00:52 +08:00
The logic for logging the path where credentials are saved was duplicated across several client implementations. This commit refactors this behavior by creating a new centralized function, `misc.LogSavingCredentials`, to handle this logging. The `SaveTokenToFile` method in each authentication token storage struct now calls this new function, ensuring consistent logging and reducing code duplication. The redundant logging statements in the client-level `SaveTokenToFile` methods have been removed.
74 lines
2.5 KiB
Go
74 lines
2.5 KiB
Go
// Package claude provides authentication and token management functionality
|
|
// for Anthropic's Claude AI services. It handles OAuth2 token storage, serialization,
|
|
// and retrieval for maintaining authenticated sessions with the Claude API.
|
|
package claude
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
|
)
|
|
|
|
// ClaudeTokenStorage stores OAuth2 token information for Anthropic Claude API authentication.
|
|
// It maintains compatibility with the existing auth system while adding Claude-specific fields
|
|
// for managing access tokens, refresh tokens, and user account information.
|
|
type ClaudeTokenStorage struct {
|
|
// IDToken is the JWT ID token containing user claims and identity information.
|
|
IDToken string `json:"id_token"`
|
|
|
|
// AccessToken is the OAuth2 access token used for authenticating API requests.
|
|
AccessToken string `json:"access_token"`
|
|
|
|
// RefreshToken is used to obtain new access tokens when the current one expires.
|
|
RefreshToken string `json:"refresh_token"`
|
|
|
|
// LastRefresh is the timestamp of the last token refresh operation.
|
|
LastRefresh string `json:"last_refresh"`
|
|
|
|
// Email is the Anthropic account email address associated with this token.
|
|
Email string `json:"email"`
|
|
|
|
// Type indicates the authentication provider type, always "claude" for this storage.
|
|
Type string `json:"type"`
|
|
|
|
// Expire is the timestamp when the current access token expires.
|
|
Expire string `json:"expired"`
|
|
}
|
|
|
|
// SaveTokenToFile serializes the Claude token storage to a JSON file.
|
|
// This method creates the necessary directory structure and writes the token
|
|
// data in JSON format to the specified file path for persistent storage.
|
|
//
|
|
// Parameters:
|
|
// - authFilePath: The full path where the token file should be saved
|
|
//
|
|
// Returns:
|
|
// - error: An error if the operation fails, nil otherwise
|
|
func (ts *ClaudeTokenStorage) SaveTokenToFile(authFilePath string) error {
|
|
misc.LogSavingCredentials(authFilePath)
|
|
ts.Type = "claude"
|
|
|
|
// Create directory structure if it doesn't exist
|
|
if err := os.MkdirAll(filepath.Dir(authFilePath), 0700); err != nil {
|
|
return fmt.Errorf("failed to create directory: %v", err)
|
|
}
|
|
|
|
// Create the token file
|
|
f, err := os.Create(authFilePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create token file: %w", err)
|
|
}
|
|
defer func() {
|
|
_ = f.Close()
|
|
}()
|
|
|
|
// Encode and write the token data as JSON
|
|
if err = json.NewEncoder(f).Encode(ts); err != nil {
|
|
return fmt.Errorf("failed to write token to file: %w", err)
|
|
}
|
|
return nil
|
|
}
|