manager.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package oauth2 // import "miniflux.app/v2/internal/oauth2"
  4. import (
  5. "context"
  6. "errors"
  7. "log/slog"
  8. )
  9. // Manager manages registered OAuth2 providers.
  10. type Manager struct {
  11. providers map[string]Provider
  12. }
  13. // FindProvider returns the provider registered under the given name,
  14. // or an error if no such provider exists.
  15. func (m *Manager) FindProvider(name string) (Provider, error) {
  16. if provider, found := m.providers[name]; found {
  17. return provider, nil
  18. }
  19. return nil, errors.New("oauth2 provider not found")
  20. }
  21. // AddProvider registers a provider under the given name.
  22. func (m *Manager) AddProvider(name string, provider Provider) {
  23. m.providers[name] = provider
  24. }
  25. // NewManager creates a Manager and registers the specified OAuth2 provider.
  26. // The provider argument must be "oidc" or "google".
  27. func NewManager(ctx context.Context, provider, clientID, clientSecret, redirectURL, oidcDiscoveryEndpoint string) *Manager {
  28. m := &Manager{providers: make(map[string]Provider)}
  29. switch provider {
  30. case "oidc":
  31. if clientSecret == "" {
  32. slog.Warn("OIDC client secret is empty or missing.")
  33. }
  34. if oidcProvider, err := NewOidcProvider(ctx, clientID, clientSecret, redirectURL, oidcDiscoveryEndpoint); err != nil {
  35. slog.Error("Failed to initialize OIDC provider",
  36. slog.Any("error", err),
  37. )
  38. } else {
  39. m.AddProvider("oidc", oidcProvider)
  40. }
  41. case "google":
  42. m.AddProvider("google", NewGoogleProvider(clientID, clientSecret, redirectURL))
  43. default:
  44. slog.Error("Unsupported OAuth2 provider",
  45. slog.String("provider", provider),
  46. )
  47. }
  48. return m
  49. }