Module: Legion::Extensions::Github::Runners::Auth
- Includes:
- App::Runners::Auth, App::Runners::CredentialStore, Helpers::Client, OAuth::Runners::Auth, Helpers::Lex
- Defined in:
- lib/legion/extensions/github/runners/auth.rb
Constant Summary
Constants included from Helpers::Client
Helpers::Client::CREDENTIAL_RESOLVERS
Constants included from Helpers::TokenCache
Helpers::TokenCache::TOKEN_BUFFER_SECONDS
Class Method Summary collapse
Instance Method Summary collapse
Methods included from OAuth::Runners::Auth
#authorize_url, #exchange_code, #generate_pkce, #oauth_connection, #poll_device_code, #refresh_token, #request_device_code, #revoke_token
Methods included from Helpers::Client
#connection, #gh_cli_token_output, #max_fallback_retries, #on_rate_limit, #on_scope_authorized, #on_scope_denied, #resolve_broker_app, #resolve_credential, #resolve_env, #resolve_gh_cli, #resolve_next_credential, #resolve_settings_app, #resolve_settings_delegated, #resolve_settings_pat, #resolve_vault_app, #resolve_vault_delegated, #resolve_vault_pat
Methods included from Helpers::ScopeRegistry
#credential_fingerprint, #invalidate_scope, #mark_rate_limited, #rate_limited?, #register_scope, #scope_status
Methods included from Helpers::TokenCache
#fetch_token, #mark_rate_limited, #rate_limited?, #store_token
Methods included from App::Runners::CredentialStore
#load_oauth_token, #store_app_credentials, #store_oauth_token
Methods included from App::Runners::Auth
#create_installation_token, #generate_jwt, #get_installation, #list_installations
Class Method Details
.remote_invocable? ⇒ Boolean
19 20 21 |
# File 'lib/legion/extensions/github/runners/auth.rb', line 19 def self.remote_invocable? false end |
Instance Method Details
#installations ⇒ Object
95 96 97 98 |
# File 'lib/legion/extensions/github/runners/auth.rb', line 95 def installations(**) log.info('[lex-github] listing app installations') list_installations(**) end |
#login(client_id: nil, scopes: nil) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/legion/extensions/github/runners/auth.rb', line 49 def login(client_id: nil, scopes: nil, **) cid = client_id || settings_client_id unless cid log.error('[lex-github] auth login: no client_id configured — set github.app.client_id in settings') return { error: 'missing_config', description: 'Set github.app.client_id in settings' } end log.info("[lex-github] auth login: starting OAuth flow with client_id=#{cid[0..7]}...") sc = scopes || settings_scopes browser = Helpers::BrowserAuth.new(client_id: cid, scopes: sc) result = browser.authenticate if result[:error] log.error("[lex-github] auth login failed: #{result[:error]} — #{result[:description]}") return { result: nil, error: result[:error], description: result[:description] } end if result[:result]&.dig('access_token') user = begin current_user(token: result[:result]['access_token']) rescue StandardError => e log.warn("[lex-github] auth login: token obtained but /user lookup failed: #{e.}") 'default' end log.info("[lex-github] auth login: authenticated as #{user}") if respond_to?(:store_oauth_token, true) store_oauth_token( user: user, access_token: result[:result]['access_token'], refresh_token: result[:result]['refresh_token'], expires_in: result[:result]['expires_in'] ) log.info("[lex-github] auth login: token stored for user=#{user}") else log.warn('[lex-github] auth login: store_oauth_token not available — token not persisted') end else log.warn('[lex-github] auth login: OAuth completed but no access_token in response') end result end |
#status ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/legion/extensions/github/runners/auth.rb', line 23 def status(**) cred = resolve_credential unless cred log.warn('[lex-github] auth status: no credential found across all sources') return { result: { authenticated: false } } end log.info("[lex-github] auth status: credential found via #{cred[:auth_type]}") user_info = {} scopes = nil begin response = connection(token: cred[:token]).get('/user') user_info = response.body || {} headers = response.respond_to?(:headers) ? response.headers : {} scopes_header = headers['X-OAuth-Scopes'] || headers['x-oauth-scopes'] scopes = scopes_header&.split(',')&.map(&:strip) log.info("[lex-github] auth status: authenticated as #{user_info['login']} (#{cred[:auth_type]})") rescue StandardError => e log.warn("[lex-github] auth status: credential found but /user request failed: #{e.}") end { result: { authenticated: true, auth_type: cred[:auth_type], user: user_info['login'], scopes: scopes } } end |