|
1 | | -name: Claude OAuth Login |
| 1 | +name: Claude OAuth Login (Simple) |
2 | 2 |
|
3 | 3 | on: |
4 | 4 | workflow_dispatch: |
|
25 | 25 | run: | |
26 | 26 | if [ -z "${{ inputs.authorization_code }}" ]; then |
27 | 27 | # No code provided, generate URL |
28 | | - cat << 'EOF' > login_start.rb |
29 | | - #!/usr/bin/env ruby |
30 | | - |
31 | | - require 'securerandom' |
32 | | - require 'uri' |
33 | | - require 'json' |
34 | | - require 'digest' |
35 | | - require 'base64' |
36 | | - |
37 | | - class ClaudeLoginStart |
38 | | - OAUTH_AUTHORIZE_URL = 'https://claude.ai/oauth/authorize' |
39 | | - CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e' |
40 | | - REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback' |
41 | | - STATE_FILE = 'claude_oauth_state.json' |
42 | | - |
43 | | - def generate_login_url |
44 | | - state = SecureRandom.hex(32) |
45 | | - code_verifier = SecureRandom.urlsafe_base64(32) |
46 | | - code_challenge = Base64.urlsafe_encode64(Digest::SHA256.digest(code_verifier)).chomp('=') |
47 | | - |
48 | | - # Save state and code verifier for verification later |
49 | | - save_state(state, code_verifier) |
50 | | - |
51 | | - params = { |
52 | | - 'code' => 'true', |
53 | | - 'client_id' => CLIENT_ID, |
54 | | - 'response_type' => 'code', |
55 | | - 'redirect_uri' => REDIRECT_URI, |
56 | | - 'scope' => 'org:create_api_key user:profile user:inference', |
57 | | - 'code_challenge' => code_challenge, |
58 | | - 'code_challenge_method' => 'S256', |
59 | | - 'state' => state |
60 | | - } |
61 | | - |
62 | | - url = "#{OAUTH_AUTHORIZE_URL}?" + URI.encode_www_form(params) |
63 | | - |
64 | | - puts url |
65 | | - |
66 | | - url |
67 | | - end |
68 | | - |
69 | | - private |
70 | | - |
71 | | - def save_state(state, code_verifier) |
72 | | - state_data = { |
73 | | - 'state' => state, |
74 | | - 'code_verifier' => code_verifier, |
75 | | - 'timestamp' => Time.now.to_i, |
76 | | - 'expires_at' => Time.now.to_i + 600 # 10 minutes |
77 | | - } |
78 | | - |
79 | | - File.write(STATE_FILE, JSON.pretty_generate(state_data)) |
80 | | - rescue => e |
81 | | - puts "Warning: Could not save state file: #{e.message}" |
82 | | - end |
83 | | - end |
84 | | - |
85 | | - login = ClaudeLoginStart.new |
86 | | - login.generate_login_url |
87 | | - EOF |
88 | | - |
89 | | - chmod +x login_start.rb |
90 | | - oauth_url=$(ruby login_start.rb) |
| 28 | + chmod +x .github/scripts/claude_oauth_login.rb |
| 29 | + oauth_url=$(.github/scripts/claude_oauth_login.rb) |
91 | 30 | |
92 | 31 | echo "## 🔐 Claude OAuth Login Instructions" >> $GITHUB_STEP_SUMMARY |
93 | 32 | echo "" >> $GITHUB_STEP_SUMMARY |
|
99 | 38 | echo "" >> $GITHUB_STEP_SUMMARY |
100 | 39 | echo "### Step 2: Run Workflow Again" >> $GITHUB_STEP_SUMMARY |
101 | 40 | echo "" >> $GITHUB_STEP_SUMMARY |
102 | | - echo "1. Go to the [Actions tab](${{ github.server_url }}/${{ github.repository }}/actions/workflows/claude-oauth-login-secure.yml)" >> $GITHUB_STEP_SUMMARY |
| 41 | + echo "1. Go to the [Actions tab](${{ github.server_url }}/${{ github.repository }}/actions/workflows/claude-oauth-login-simple.yml)" >> $GITHUB_STEP_SUMMARY |
103 | 42 | echo "2. Click 'Run workflow'" >> $GITHUB_STEP_SUMMARY |
104 | 43 | echo "3. Paste the authorization code in the input field" >> $GITHUB_STEP_SUMMARY |
105 | 44 | echo "4. Click 'Run workflow' to process the code" >> $GITHUB_STEP_SUMMARY |
|
0 commit comments