Module: Panda::Core::Engine::OmniauthConfig

Extended by:
ActiveSupport::Concern
Included in:
Panda::Core::Engine
Defined in:
lib/panda/core/engine/omniauth_config.rb

Constant Summary collapse

PROVIDER_REGISTRY =
{
  # Microsoft
  "microsoft" => :microsoft_graph,
  "microsoft_graph" => :microsoft_graph,

  # Google
  "google" => :google_oauth2,
  "google_oauth2" => :google_oauth2,
  "gmail" => :google_oauth2,

  # GitHub
  "github" => :github,
  "gh" => :github,

  # Apple (Sign in with Apple)
  "apple" => :apple,

  # Developer
  "developer" => :developer
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.apple_credentials_configured?(settings) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
51
# File 'lib/panda/core/engine/omniauth_config.rb', line 46

def self.apple_credentials_configured?(settings)
  settings[:client_id].present? &&
    settings.dig(:options, :team_id).present? &&
    settings.dig(:options, :key_id).present? &&
    settings.dig(:options, :pem).present?
end

.credentials_configured?(symbol, settings) ⇒ Boolean

Whether a provider has enough credentials to register / show on login. Apple uses a JWT client secret derived from team_id / key_id / pem (no static client_secret).

Returns:

  • (Boolean)


35
36
37
38
39
40
41
42
43
44
# File 'lib/panda/core/engine/omniauth_config.rb', line 35

def self.credentials_configured?(symbol, settings)
  case symbol.to_sym
  when :developer
    true
  when :apple
    apple_credentials_configured?(settings)
  else
    settings[:client_id].present? && settings[:client_secret].present?
  end
end

.register_provider(builder, symbol, settings, options) ⇒ Object

Register a provider on an OmniAuth::Builder. Apple's strategy ignores the static secret and signs a JWT from options.



55
56
57
58
59
60
61
62
63
64
# File 'lib/panda/core/engine/omniauth_config.rb', line 55

def self.register_provider(builder, symbol, settings, options)
  case symbol.to_sym
  when :apple
    builder.provider :apple, settings[:client_id], "", options
  when :developer
    builder.provider :developer, options
  else
    builder.provider symbol, settings[:client_id], settings[:client_secret], options
  end
end

Instance Method Details

#configure_provider(builder, name, settings) ⇒ Object

Configure a single provider on the OmniAuth builder

Parameters:

  • builder (OmniAuth::Builder)

    the OmniAuth builder instance

  • name (String)

    the provider name (may be an alias)

  • settings (Hash)

    provider configuration



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/panda/core/engine/omniauth_config.rb', line 117

def configure_provider(builder, name, settings)
  symbol = PROVIDER_REGISTRY[name.to_s]

  unless symbol
    Rails.logger.warn("[panda-core] Unknown OmniAuth provider: #{name.inspect}") if defined?(Rails.logger)
    return
  end

  return if symbol == :developer && !Rails.env.development?

  unless OmniauthConfig.credentials_configured?(symbol, settings)
    Rails.logger.info("[panda-core] Skipping OmniAuth provider #{name.inspect}: missing credentials") if defined?(Rails.logger)
    return
  end

  options = (settings[:options] || {}).dup
  options[:name] = settings[:path_name] if settings[:path_name].present?

  OmniauthConfig.register_provider(builder, symbol, settings, options)
end

#load_yaml_provider_overrides!Object

Deprecated.

Use class method load_yaml_provider_overrides_early! instead

Instance method for loading YAML provider overrides (for testing)



102
103
104
105
106
107
108
109
110
111
# File 'lib/panda/core/engine/omniauth_config.rb', line 102

def load_yaml_provider_overrides!
  path = Panda::Core::Engine.root.join("config/providers.yml")
  return unless File.exist?(path)

  yaml = YAML.load_file(path) || {}
  (yaml["providers"] || {}).each do |name, settings|
    Panda::Core.config.authentication_providers[name.to_s] ||= {}
    Panda::Core.config.authentication_providers[name.to_s].deep_merge!(settings)
  end
end