Fix .gitignore and add missing authentication source files
This commit fixes overly broad .gitignore patterns that were excluding important source code files from version control. Previously, wildcard patterns like *auth*, *token*, *secret*, *connection*, and *credential* were excluding ALL files containing these words, including critical application code. Changes: - Updated .gitignore with specific patterns for sensitive config files (*.json, *.txt, *.yml, *.yaml extensions only) - Removed broad wildcards that excluded source code files Added missing source files: - shared/auth/ (9 files): Complete authentication system - JWT handler, middleware, auth service, models, routes - reports-app/backend/app/routers/auth.py: Authentication API router - reports-app/backend/app/auth_middleware_wrapper.py: Middleware wrapper - reports-app/frontend/src/stores/auth.js: Vue.js auth store - reports-app/frontend/tests/: E2E tests and fixtures for auth - reports-app/telegram-bot/app/auth/: Telegram auth linking module - deployment/windows/scripts/Setup-ClaudeAuth.ps1: Windows deployment script - security/secrets_scanner.py: Security scanning utility These files are essential for the application to function and should have been included in the initial commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
437
deployment/windows/scripts/Setup-ClaudeAuth.ps1
Normal file
437
deployment/windows/scripts/Setup-ClaudeAuth.ps1
Normal file
@@ -0,0 +1,437 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Setup Claude Authentication on Windows Server using Claude Pro subscription
|
||||
|
||||
.DESCRIPTION
|
||||
This script helps authenticate Claude Agent SDK using Claude Pro/Max subscription.
|
||||
Two methods are supported:
|
||||
1. Direct login on server (opens browser for authentication)
|
||||
2. Copy credentials from development machine
|
||||
|
||||
.PARAMETER Method
|
||||
Authentication method: 'login' or 'copy' (default: login)
|
||||
|
||||
.PARAMETER CredentialsPath
|
||||
Path to credentials file (for 'copy' method)
|
||||
|
||||
.EXAMPLE
|
||||
.\Setup-ClaudeAuth.ps1
|
||||
Interactive login on server (opens browser)
|
||||
|
||||
.EXAMPLE
|
||||
.\Setup-ClaudeAuth.ps1 -Method copy -CredentialsPath "C:\path\to\credentials.json"
|
||||
Copy credentials from file
|
||||
|
||||
.NOTES
|
||||
Author: ROA2WEB Team
|
||||
Requires: Claude Pro/Max subscription, Python 3.11+
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet('login', 'copy')]
|
||||
[string]$Method = 'login',
|
||||
[string]$CredentialsPath = ""
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# =============================================================================
|
||||
# HELPER FUNCTIONS
|
||||
# =============================================================================
|
||||
|
||||
function Write-Step {
|
||||
param([string]$Message)
|
||||
Write-Host "`n[*] $Message" -ForegroundColor Cyan
|
||||
}
|
||||
|
||||
function Write-Success {
|
||||
param([string]$Message)
|
||||
Write-Host " [OK] $Message" -ForegroundColor Green
|
||||
}
|
||||
|
||||
function Write-Error {
|
||||
param([string]$Message)
|
||||
Write-Host " [ERROR] $Message" -ForegroundColor Red
|
||||
}
|
||||
|
||||
function Write-Warning {
|
||||
param([string]$Message)
|
||||
Write-Host " [WARN] $Message" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
function Test-ClaudeInstalled {
|
||||
Write-Step "Checking for Claude Code installation..."
|
||||
|
||||
try {
|
||||
$result = & claude-code --version 2>&1
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Success "Claude Code is installed: $result"
|
||||
return $true
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "Claude Code CLI not found"
|
||||
return $false
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
function Install-ClaudeCode {
|
||||
Write-Step "Installing Claude Code CLI..."
|
||||
|
||||
try {
|
||||
# Check if npm is available
|
||||
$npmVersion = & npm --version 2>&1
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "npm is not installed. Please install Node.js first."
|
||||
Write-Host " Download from: https://nodejs.org/" -ForegroundColor Yellow
|
||||
throw "npm not found"
|
||||
}
|
||||
|
||||
Write-Success "npm found: v$npmVersion"
|
||||
|
||||
# Install claude-code globally
|
||||
Write-Step "Installing @anthropic-ai/claude-code via npm..."
|
||||
& npm install -g @anthropic-ai/claude-code
|
||||
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Success "Claude Code CLI installed successfully"
|
||||
return $true
|
||||
} else {
|
||||
throw "npm install failed"
|
||||
}
|
||||
} catch {
|
||||
Write-Error "Failed to install Claude Code CLI: $_"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Invoke-ClaudeLogin {
|
||||
Write-Step "Initiating Claude authentication..."
|
||||
|
||||
Write-Host "`n" + ("=" * 60) -ForegroundColor Yellow
|
||||
Write-Host " IMPORTANT: Browser Authentication Required" -ForegroundColor Yellow
|
||||
Write-Host ("=" * 60) -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
Write-Host " 1. A browser window will open" -ForegroundColor White
|
||||
Write-Host " 2. Log in with your Claude Pro/Max account" -ForegroundColor White
|
||||
Write-Host " 3. Authorize the application" -ForegroundColor White
|
||||
Write-Host " 4. Return to this window after authentication" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host ("=" * 60) -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
|
||||
$response = Read-Host "Press ENTER to open browser and continue (or Ctrl+C to cancel)"
|
||||
|
||||
try {
|
||||
Write-Step "Opening browser for authentication..."
|
||||
& claude-code login
|
||||
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Success "Authentication successful!"
|
||||
return $true
|
||||
} else {
|
||||
Write-Error "Authentication failed or was cancelled"
|
||||
return $false
|
||||
}
|
||||
} catch {
|
||||
Write-Error "Failed to authenticate: $_"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Find-CredentialsInPackage {
|
||||
Write-Step "Searching for credentials in deployment package..."
|
||||
|
||||
# Try to find credentials in common locations
|
||||
$searchPaths = @(
|
||||
# If running from scripts/ subdirectory
|
||||
(Join-Path $PSScriptRoot "..\claude-credentials.json"),
|
||||
# If running from package root
|
||||
(Join-Path $PSScriptRoot "claude-credentials.json"),
|
||||
# If in temp deployment location
|
||||
"C:\Temp\telegram-bot-deploy\claude-credentials.json",
|
||||
"C:\Temp\telegram-bot-updated\claude-credentials.json",
|
||||
# If already in installation directory
|
||||
"C:\inetpub\wwwroot\roa2web\telegram-bot\claude-credentials.json"
|
||||
)
|
||||
|
||||
foreach ($path in $searchPaths) {
|
||||
$resolved = [System.IO.Path]::GetFullPath($path)
|
||||
if (Test-Path $resolved) {
|
||||
Write-Success "Found credentials at: $resolved"
|
||||
return $resolved
|
||||
}
|
||||
}
|
||||
|
||||
Write-Warning "No credentials file found in deployment package"
|
||||
return $null
|
||||
}
|
||||
|
||||
function Copy-CredentialsFile {
|
||||
param([string]$SourcePath)
|
||||
|
||||
Write-Step "Copying credentials from: $SourcePath"
|
||||
|
||||
if (-not (Test-Path $SourcePath)) {
|
||||
Write-Error "Credentials file not found: $SourcePath"
|
||||
return $false
|
||||
}
|
||||
|
||||
try {
|
||||
# Determine credentials directory (correct location: %USERPROFILE%\.claude\)
|
||||
$credentialsDir = Join-Path $env:USERPROFILE ".claude"
|
||||
$credentialsFile = Join-Path $credentialsDir ".credentials.json"
|
||||
|
||||
# Create directory if needed
|
||||
if (-not (Test-Path $credentialsDir)) {
|
||||
New-Item -ItemType Directory -Path $credentialsDir -Force | Out-Null
|
||||
Write-Success "Created credentials directory: $credentialsDir"
|
||||
}
|
||||
|
||||
# Copy credentials file
|
||||
Copy-Item -Path $SourcePath -Destination $credentialsFile -Force
|
||||
Write-Success "Credentials copied successfully"
|
||||
Write-Success "Location: $credentialsFile"
|
||||
|
||||
return $true
|
||||
} catch {
|
||||
Write-Error "Failed to copy credentials: $_"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Test-ClaudeAuth {
|
||||
Write-Step "Testing Claude authentication..."
|
||||
|
||||
# Check both possible locations
|
||||
$possibleLocations = @(
|
||||
(Join-Path $env:USERPROFILE ".claude\.credentials.json"), # Correct location
|
||||
(Join-Path $env:APPDATA "claude\credentials.json") # Alternative location
|
||||
)
|
||||
|
||||
$credentialsFile = $null
|
||||
foreach ($location in $possibleLocations) {
|
||||
if (Test-Path $location) {
|
||||
$credentialsFile = $location
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $credentialsFile) {
|
||||
Write-Warning "Credentials file not found at any expected location"
|
||||
Write-Host " Checked: $($possibleLocations -join ', ')" -ForegroundColor Gray
|
||||
return $false
|
||||
}
|
||||
|
||||
try {
|
||||
# Read credentials file
|
||||
$credentials = Get-Content $credentialsFile -Raw | ConvertFrom-Json
|
||||
|
||||
if ($credentials -and $credentials.sessionKey) {
|
||||
Write-Success "Credentials file found and valid"
|
||||
Write-Success "Location: $credentialsFile"
|
||||
Write-Success "Session key: $($credentials.sessionKey.Substring(0, 20))..."
|
||||
return $true
|
||||
} else {
|
||||
Write-Warning "Credentials file exists but appears invalid"
|
||||
return $false
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "Could not validate credentials: $_"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Update-EnvFile {
|
||||
Write-Step "Updating .env file..."
|
||||
|
||||
$envPath = "C:\inetpub\wwwroot\roa2web\telegram-bot\.env"
|
||||
|
||||
if (-not (Test-Path $envPath)) {
|
||||
Write-Warning ".env file not found at: $envPath"
|
||||
Write-Host " Please create it manually or run Install-TelegramBot.ps1 first" -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
$envContent = Get-Content $envPath -Raw
|
||||
|
||||
# Check if CLAUDE_API_KEY is set
|
||||
if ($envContent -match "^CLAUDE_API_KEY=.+$" -and $envContent -notmatch "^CLAUDE_API_KEY=\s*$") {
|
||||
Write-Success ".env already has CLAUDE_API_KEY set"
|
||||
Write-Host " Using API key authentication (takes precedence over browser login)" -ForegroundColor Gray
|
||||
} else {
|
||||
Write-Success ".env will use Claude Pro subscription (browser login)"
|
||||
Write-Host " No CLAUDE_API_KEY needed!" -ForegroundColor Green
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "Could not read .env file: $_"
|
||||
}
|
||||
}
|
||||
|
||||
function Show-Summary {
|
||||
Write-Host "`n" + ("=" * 60) -ForegroundColor Cyan
|
||||
Write-Host " CLAUDE AUTHENTICATION SETUP COMPLETE" -ForegroundColor Green
|
||||
Write-Host ("=" * 60) -ForegroundColor Cyan
|
||||
|
||||
# Check both possible locations
|
||||
$possibleLocations = @(
|
||||
(Join-Path $env:USERPROFILE ".claude\.credentials.json"),
|
||||
(Join-Path $env:APPDATA "claude\credentials.json")
|
||||
)
|
||||
|
||||
$credentialsFile = $null
|
||||
foreach ($location in $possibleLocations) {
|
||||
if (Test-Path $location) {
|
||||
$credentialsFile = $location
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $credentialsFile) {
|
||||
$credentialsFile = Join-Path $env:USERPROFILE ".claude\.credentials.json" # Default expected location
|
||||
}
|
||||
|
||||
Write-Host "`nAuthentication Details:" -ForegroundColor Yellow
|
||||
Write-Host " Method: Claude Pro/Max Subscription (Browser Login)"
|
||||
Write-Host " Credentials File: $credentialsFile"
|
||||
Write-Host " Status: $(if (Test-Path $credentialsFile) { 'Authenticated ✓' } else { 'Not Found' })"
|
||||
|
||||
Write-Host "`nNext Steps:" -ForegroundColor Yellow
|
||||
Write-Host " 1. Verify .env file: C:\inetpub\wwwroot\roa2web\telegram-bot\.env"
|
||||
Write-Host " - Remove or leave empty: CLAUDE_API_KEY="
|
||||
Write-Host " 2. Restart Telegram bot service:"
|
||||
Write-Host " cd C:\inetpub\wwwroot\roa2web\telegram-bot\scripts"
|
||||
Write-Host " .\Restart-TelegramBot.ps1"
|
||||
Write-Host " 3. Check logs for 'Using claude-code login' message:"
|
||||
Write-Host " Get-Content C:\inetpub\wwwroot\roa2web\telegram-bot\logs\stdout.log -Tail 50"
|
||||
|
||||
Write-Host "`nTroubleshooting:" -ForegroundColor Yellow
|
||||
Write-Host " - If authentication fails, re-run: .\Setup-ClaudeAuth.ps1"
|
||||
Write-Host " - Check credentials: Get-Content '$credentialsFile'"
|
||||
Write-Host " - Credentials expire after ~30 days (re-authenticate when needed)"
|
||||
Write-Host " - Expected location: %USERPROFILE%\.claude\.credentials.json"
|
||||
|
||||
Write-Host "`n" + ("=" * 60) -ForegroundColor Cyan
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# MAIN SETUP FLOW
|
||||
# =============================================================================
|
||||
|
||||
function Main {
|
||||
Write-Host @"
|
||||
|
||||
====================================================================
|
||||
ROA2WEB Telegram Bot - Claude Authentication Setup
|
||||
Configure Claude Pro/Max subscription authentication
|
||||
====================================================================
|
||||
|
||||
"@ -ForegroundColor Cyan
|
||||
|
||||
try {
|
||||
# First, check if credentials exist in deployment package
|
||||
$packageCredentials = Find-CredentialsInPackage
|
||||
|
||||
if ($packageCredentials -and $Method -eq 'login') {
|
||||
Write-Host "`n" + ("=" * 60) -ForegroundColor Green
|
||||
Write-Host " CREDENTIALS FOUND IN DEPLOYMENT PACKAGE!" -ForegroundColor Green
|
||||
Write-Host ("=" * 60) -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host "Found credentials at: $packageCredentials" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
$usePackage = Read-Host "Use these credentials? (Y/N)"
|
||||
|
||||
if ($usePackage -eq "Y" -or $usePackage -eq "y") {
|
||||
Write-Host "`nUsing credentials from deployment package..." -ForegroundColor Yellow
|
||||
$copySuccess = Copy-CredentialsFile -SourcePath $packageCredentials
|
||||
|
||||
if (-not $copySuccess) {
|
||||
throw "Failed to copy credentials from package"
|
||||
}
|
||||
|
||||
# Skip other methods
|
||||
$Method = 'package'
|
||||
} else {
|
||||
Write-Host "Proceeding with browser login..." -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
|
||||
if ($Method -eq 'login') {
|
||||
# Method 1: Direct login on server
|
||||
Write-Host "Method: Direct Browser Login" -ForegroundColor Yellow
|
||||
|
||||
# Check if claude-code is installed
|
||||
$isInstalled = Test-ClaudeInstalled
|
||||
|
||||
if (-not $isInstalled) {
|
||||
Write-Step "Claude Code CLI not found. Installing..."
|
||||
$installed = Install-ClaudeCode
|
||||
|
||||
if (-not $installed) {
|
||||
throw "Failed to install Claude Code CLI"
|
||||
}
|
||||
}
|
||||
|
||||
# Perform login
|
||||
$loginSuccess = Invoke-ClaudeLogin
|
||||
|
||||
if (-not $loginSuccess) {
|
||||
throw "Authentication failed"
|
||||
}
|
||||
|
||||
} elseif ($Method -eq 'copy') {
|
||||
# Method 2: Copy credentials from file
|
||||
Write-Host "Method: Copy Credentials from File" -ForegroundColor Yellow
|
||||
|
||||
# If no path provided, try to find automatically
|
||||
if (-not $CredentialsPath) {
|
||||
$autoFound = Find-CredentialsInPackage
|
||||
if ($autoFound) {
|
||||
Write-Host "`nFound credentials in package: $autoFound" -ForegroundColor Green
|
||||
$useAuto = Read-Host "Use this file? (Y/N)"
|
||||
|
||||
if ($useAuto -eq "Y" -or $useAuto -eq "y") {
|
||||
$CredentialsPath = $autoFound
|
||||
} else {
|
||||
$CredentialsPath = Read-Host "Enter full path to credentials.json"
|
||||
}
|
||||
} else {
|
||||
$CredentialsPath = Read-Host "Enter full path to credentials.json"
|
||||
}
|
||||
}
|
||||
|
||||
$copySuccess = Copy-CredentialsFile -SourcePath $CredentialsPath
|
||||
|
||||
if (-not $copySuccess) {
|
||||
throw "Failed to copy credentials"
|
||||
}
|
||||
}
|
||||
|
||||
# Test authentication
|
||||
$authValid = Test-ClaudeAuth
|
||||
|
||||
if (-not $authValid) {
|
||||
Write-Warning "Could not validate authentication. Service may still work."
|
||||
}
|
||||
|
||||
# Update .env file
|
||||
Update-EnvFile
|
||||
|
||||
# Show summary
|
||||
Show-Summary
|
||||
|
||||
Write-Host "`nSetup completed successfully!" -ForegroundColor Green
|
||||
|
||||
} catch {
|
||||
Write-Host "`n[SETUP FAILED] $_" -ForegroundColor Red
|
||||
Write-Host $_.ScriptStackTrace -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# Run main setup
|
||||
Main
|
||||
Reference in New Issue
Block a user