Fix external auth provider management
This commit is contained in:
+3
-2
@@ -4,6 +4,8 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
authService "github.com/cortezaproject/corteza-server/auth"
|
||||
authSettings "github.com/cortezaproject/corteza-server/auth/settings"
|
||||
autService "github.com/cortezaproject/corteza-server/automation/service"
|
||||
@@ -30,7 +32,6 @@ import (
|
||||
"github.com/cortezaproject/corteza-server/system/types"
|
||||
"go.uber.org/zap"
|
||||
gomail "gopkg.in/mail.v2"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -419,7 +420,7 @@ func updateAuthSettings(svc authServicer, current *types.AppSettings) {
|
||||
)
|
||||
|
||||
for _, p := range cas.External.Providers {
|
||||
if !p.Enabled {
|
||||
if !p.Enabled || p.Handle == "" || p.IssuerUrl == "" || p.Key == "" || p.Secret == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
+9
-8
@@ -4,6 +4,13 @@ import (
|
||||
"context"
|
||||
"embed"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Masterminds/sprig"
|
||||
"github.com/cortezaproject/corteza-server/auth/external"
|
||||
"github.com/cortezaproject/corteza-server/auth/handlers"
|
||||
@@ -20,12 +27,6 @@ import (
|
||||
"github.com/go-chi/chi"
|
||||
oauth2def "github.com/go-oauth2/oauth2/v4"
|
||||
"go.uber.org/zap"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type (
|
||||
@@ -216,7 +217,7 @@ func New(ctx context.Context, log *zap.Logger, s store.Storer, opt options.AuthO
|
||||
Settings: svc.settings,
|
||||
}
|
||||
|
||||
external.Init(log, sesManager.Store())
|
||||
external.Init(sesManager.Store())
|
||||
|
||||
return
|
||||
}
|
||||
@@ -248,7 +249,7 @@ func (svc *service) UpdateSettings(s *settings.Settings) {
|
||||
|
||||
if len(svc.settings.Providers) != len(s.Providers) {
|
||||
svc.log.Debug("setting changed", zap.Int("providers", len(s.Providers)))
|
||||
external.SetupGothProviders(svc.opt.ExternalRedirectURL, s.Providers...)
|
||||
external.SetupGothProviders(svc.log, svc.opt.ExternalRedirectURL, s.Providers...)
|
||||
}
|
||||
|
||||
svc.settings = s
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"github.com/cortezaproject/corteza-server/auth/external"
|
||||
"github.com/cortezaproject/corteza-server/pkg/auth"
|
||||
"github.com/cortezaproject/corteza-server/pkg/cli"
|
||||
"github.com/cortezaproject/corteza-server/pkg/logger"
|
||||
"github.com/cortezaproject/corteza-server/pkg/options"
|
||||
"github.com/cortezaproject/corteza-server/system/service"
|
||||
"github.com/cortezaproject/corteza-server/system/types"
|
||||
@@ -44,6 +45,7 @@ func General(app serviceInitializer, opt options.AuthOpt) *cobra.Command {
|
||||
ctx := auth.SetSuperUserContext(cli.Context())
|
||||
_, err := external.RegisterOidcProvider(
|
||||
ctx,
|
||||
logger.Default(),
|
||||
opt,
|
||||
args[0],
|
||||
args[1],
|
||||
|
||||
+1
-7
@@ -3,18 +3,12 @@ package external
|
||||
import (
|
||||
"github.com/gorilla/sessions"
|
||||
"github.com/markbates/goth/gothic"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var (
|
||||
log = zap.NewNop()
|
||||
)
|
||||
|
||||
const (
|
||||
OIDC_PROVIDER_PREFIX = "openid-connect."
|
||||
)
|
||||
|
||||
func Init(logger *zap.Logger, store sessions.Store) {
|
||||
log = logger.Named("external")
|
||||
func Init(store sessions.Store) {
|
||||
gothic.Store = store
|
||||
}
|
||||
Vendored
+4
-3
@@ -1,6 +1,8 @@
|
||||
package external
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/cortezaproject/corteza-server/auth/settings"
|
||||
"github.com/markbates/goth"
|
||||
"github.com/markbates/goth/providers/facebook"
|
||||
@@ -9,7 +11,6 @@ import (
|
||||
"github.com/markbates/goth/providers/linkedin"
|
||||
"github.com/markbates/goth/providers/openidConnect"
|
||||
"go.uber.org/zap"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// We're expecting that our users will be able to complete
|
||||
@@ -18,7 +19,7 @@ const (
|
||||
WellKnown = "/.well-known/openid-configuration"
|
||||
)
|
||||
|
||||
func SetupGothProviders(redirectUrl string, ep ...settings.Provider) {
|
||||
func SetupGothProviders(log *zap.Logger, redirectUrl string, ep ...settings.Provider) {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
@@ -43,7 +44,7 @@ func SetupGothProviders(redirectUrl string, ep ...settings.Provider) {
|
||||
redirect = strings.Replace(redirectUrl, "{provider}", pc.Handle, 1)
|
||||
}
|
||||
|
||||
if strings.Index(pc.Handle, OIDC_PROVIDER_PREFIX) == 0 {
|
||||
if strings.HasPrefix(pc.Handle, OIDC_PROVIDER_PREFIX) {
|
||||
if pc.IssuerUrl == "" {
|
||||
log.Error("failed to discover OIDC provider, URL empty")
|
||||
continue
|
||||
|
||||
Vendored
+20
-18
@@ -2,26 +2,28 @@ package external
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/cortezaproject/corteza-server/pkg/options"
|
||||
"github.com/cortezaproject/corteza-server/system/service"
|
||||
"github.com/cortezaproject/corteza-server/system/types"
|
||||
"github.com/crusttech/go-oidc"
|
||||
"github.com/pkg/errors"
|
||||
"go.uber.org/zap"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func AddProvider(ctx context.Context, eap *types.ExternalAuthProvider, force bool) error {
|
||||
func AddProvider(ctx context.Context, log *zap.Logger, eap *types.ExternalAuthProvider, force bool) error {
|
||||
var (
|
||||
s = service.CurrentSettings
|
||||
log = log.With(
|
||||
zap.Bool("force", force),
|
||||
zap.String("handle", eap.Handle),
|
||||
zap.String("key", eap.Key),
|
||||
)
|
||||
s = service.CurrentSettings
|
||||
)
|
||||
|
||||
log = log.With(
|
||||
zap.Bool("force", force),
|
||||
zap.String("handle", eap.Handle),
|
||||
zap.String("key", eap.Key),
|
||||
)
|
||||
|
||||
if eap.IssuerUrl != "" {
|
||||
@@ -50,16 +52,16 @@ func AddProvider(ctx context.Context, eap *types.ExternalAuthProvider, force boo
|
||||
|
||||
// @todo remove dependency on github.com/crusttech/go-oidc (and github.com/coreos/go-oidc)
|
||||
// and move client registration to corteza codebase
|
||||
func DiscoverOidcProvider(ctx context.Context, opt options.AuthOpt, name, url string) (eap *types.ExternalAuthProvider, err error) {
|
||||
func DiscoverOidcProvider(ctx context.Context, log *zap.Logger, opt options.AuthOpt, name, url string) (eap *types.ExternalAuthProvider, err error) {
|
||||
var (
|
||||
provider *oidc.Provider
|
||||
client *oidc.Client
|
||||
redirectUrl = strings.Replace(opt.ExternalRedirectURL, "{provider}", OIDC_PROVIDER_PREFIX+name, 1)
|
||||
)
|
||||
|
||||
log = log.With(
|
||||
zap.String("name", name),
|
||||
zap.String("url", url),
|
||||
)
|
||||
log = log.With(
|
||||
zap.String("name", name),
|
||||
zap.String("url", url),
|
||||
)
|
||||
|
||||
if provider, err = oidc.NewProvider(ctx, url); err != nil {
|
||||
@@ -90,7 +92,7 @@ func DiscoverOidcProvider(ctx context.Context, opt options.AuthOpt, name, url st
|
||||
return
|
||||
}
|
||||
|
||||
func RegisterOidcProvider(ctx context.Context, opt options.AuthOpt, name, providerUrl string, force, validate, enable bool) (eap *types.ExternalAuthProvider, err error) {
|
||||
func RegisterOidcProvider(ctx context.Context, log *zap.Logger, opt options.AuthOpt, name, providerUrl string, force, validate, enable bool) (eap *types.ExternalAuthProvider, err error) {
|
||||
var (
|
||||
s = service.CurrentSettings
|
||||
)
|
||||
@@ -123,7 +125,7 @@ func RegisterOidcProvider(ctx context.Context, opt options.AuthOpt, name, provid
|
||||
return
|
||||
}
|
||||
|
||||
eap, err = DiscoverOidcProvider(ctx, opt, name, p.String())
|
||||
eap, err = DiscoverOidcProvider(ctx, log, opt, name, p.String())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
+13
-16
@@ -6,7 +6,6 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/cortezaproject/corteza-server/auth/external"
|
||||
@@ -269,33 +268,31 @@ func (h *AuthHandlers) enrichTmplData(req *request.AuthReq) interface{} {
|
||||
d["alerts"] = append(req.PrevAlerts, req.NewAlerts...)
|
||||
|
||||
dSettings := *h.Settings
|
||||
dSettings.Providers = nil
|
||||
d["settings"] = dSettings
|
||||
|
||||
providers := h.AuthService.GetProviders()
|
||||
sort.Sort(providers)
|
||||
|
||||
var pp = make([]provider, 0, len(providers))
|
||||
for i := range providers {
|
||||
if !providers[i].Enabled {
|
||||
var pp = make([]provider, 0, len(dSettings.Providers))
|
||||
for _, p := range dSettings.Providers {
|
||||
if _, err := goth.GetProvider(p.Handle); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
p := provider{
|
||||
Label: providers[i].Label,
|
||||
Handle: providers[i].Handle,
|
||||
Icon: providers[i].Handle,
|
||||
out := provider{
|
||||
Label: p.Label,
|
||||
Handle: p.Handle,
|
||||
Icon: p.Handle,
|
||||
}
|
||||
|
||||
if strings.HasPrefix(p.Icon, external.OIDC_PROVIDER_PREFIX) {
|
||||
p.Icon = "key"
|
||||
if strings.HasPrefix(out.Icon, external.OIDC_PROVIDER_PREFIX) {
|
||||
out.Icon = "key"
|
||||
}
|
||||
|
||||
pp = append(pp, p)
|
||||
pp = append(pp, out)
|
||||
}
|
||||
|
||||
d["providers"] = pp
|
||||
|
||||
dSettings.Providers = nil
|
||||
d["settings"] = dSettings
|
||||
|
||||
return d
|
||||
}
|
||||
|
||||
|
||||
@@ -3,12 +3,13 @@ package provision
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/cortezaproject/corteza-server/auth/external"
|
||||
"github.com/cortezaproject/corteza-server/pkg/auth"
|
||||
"github.com/cortezaproject/corteza-server/pkg/options"
|
||||
"github.com/cortezaproject/corteza-server/system/types"
|
||||
"go.uber.org/zap"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Provisions OIDC providers from PROVISION_OIDC_PROVIDER env variable
|
||||
@@ -48,7 +49,7 @@ func oidcAutoDiscovery(ctx context.Context, log *zap.Logger, opt options.AuthOpt
|
||||
//
|
||||
// enable: true
|
||||
// we want provider & the entire external auth to be validated
|
||||
eap, err = external.RegisterOidcProvider(ctx, opt, name, purl, false, false, true)
|
||||
eap, err = external.RegisterOidcProvider(ctx, log, opt, name, purl, false, false, true)
|
||||
|
||||
if err != nil {
|
||||
log.Error(
|
||||
@@ -115,7 +116,7 @@ func authAddExternals(ctx context.Context, log *zap.Logger) (err error) {
|
||||
|
||||
ctx = auth.SetSuperUserContext(ctx)
|
||||
|
||||
_ = external.AddProvider(ctx, eap, false)
|
||||
_ = external.AddProvider(ctx, log, eap, false)
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user