mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2026-06-18 17:30:13 +00:00
feat: use dig for controllers
This commit is contained in:
@@ -229,7 +229,7 @@ func (app *BootstrapApp) Setup() error {
|
|||||||
Queries repository.Store
|
Queries repository.Store
|
||||||
}
|
}
|
||||||
|
|
||||||
app.dig.Provide(func() utilityProvider {
|
err = app.dig.Provide(func() utilityProvider {
|
||||||
return utilityProvider{
|
return utilityProvider{
|
||||||
Log: app.log,
|
Log: app.log,
|
||||||
Config: &app.config,
|
Config: &app.config,
|
||||||
@@ -240,6 +240,10 @@ func (app *BootstrapApp) Setup() error {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide utilities to container: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
// services
|
// services
|
||||||
err = app.setupServices()
|
err = app.setupServices()
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/tinyauthapp/tinyauth/internal/controller"
|
"github.com/tinyauthapp/tinyauth/internal/controller"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/middleware"
|
"github.com/tinyauthapp/tinyauth/internal/middleware"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/model"
|
"github.com/tinyauthapp/tinyauth/internal/model"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
@@ -40,31 +41,119 @@ func (app *BootstrapApp) setupRouter() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contextMiddleware := middleware.NewContextMiddleware(app.log, app.runtime, app.services.authService, app.services.oauthBrokerService, app.services.tailscaleService)
|
err := app.dig.Provide(middleware.NewContextMiddleware)
|
||||||
engine.Use(contextMiddleware.Middleware())
|
|
||||||
|
|
||||||
uiMiddleware, err := middleware.NewUIMiddleware()
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to initialize UI middleware: %w", err)
|
return fmt.Errorf("failed to provide context middleware: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
engine.Use(uiMiddleware.Middleware())
|
err = app.dig.Provide(middleware.NewUIMiddleware)
|
||||||
|
|
||||||
zerologMiddleware := middleware.NewZerologMiddleware(app.log)
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide ui middleware: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
engine.Use(zerologMiddleware.Middleware())
|
err = app.dig.Provide(middleware.NewZerologMiddleware)
|
||||||
|
|
||||||
apiRouter := engine.Group("/api")
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide zerolog middleware: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
controller.NewContextController(app.log, app.config, app.runtime, apiRouter)
|
type middlewareInput struct {
|
||||||
controller.NewOAuthController(app.log, app.config, app.runtime, apiRouter, app.services.authService)
|
dig.In
|
||||||
controller.NewOIDCController(app.log, app.services.oidcService, app.runtime, apiRouter, &engine.RouterGroup)
|
|
||||||
controller.NewProxyController(app.log, app.runtime, apiRouter, app.services.accessControlService, app.services.authService, app.services.policyEngine)
|
ContextMiddleware *middleware.ContextMiddleware
|
||||||
controller.NewUserController(app.log, app.runtime, apiRouter, app.services.authService)
|
UIMiddleware *middleware.UIMiddleware
|
||||||
controller.NewResourcesController(app.config, &engine.RouterGroup)
|
ZerologMiddleware *middleware.ZerologMiddleware
|
||||||
controller.NewHealthController(apiRouter)
|
}
|
||||||
controller.NewWellKnownController(app.services.oidcService, &engine.RouterGroup)
|
|
||||||
|
err = app.dig.Invoke(func(mi middlewareInput) {
|
||||||
|
engine.Use(mi.ContextMiddleware.Middleware())
|
||||||
|
engine.Use(mi.UIMiddleware.Middleware())
|
||||||
|
engine.Use(mi.ZerologMiddleware.Middleware())
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to invoke middleware: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(func() *gin.RouterGroup {
|
||||||
|
return &engine.RouterGroup
|
||||||
|
}, dig.Name("mainRouterGroup"))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide main router group: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(func() *gin.RouterGroup {
|
||||||
|
return engine.Group("/api")
|
||||||
|
}, dig.Name("apiRouterGroup"))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide api router group: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewContextController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide context controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewOAuthController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide oauth controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewOIDCController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide oidc controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewProxyController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide proxy controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewUserController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide user controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewResourcesController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide resources controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewHealthController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide health controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(controller.NewWellKnownController)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide well-known controller: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type controllerInput struct {
|
||||||
|
dig.In
|
||||||
|
|
||||||
|
ContextController *controller.ContextController
|
||||||
|
OAuthController *controller.OAuthController
|
||||||
|
OIDCController *controller.OIDCController
|
||||||
|
ProxyController *controller.ProxyController
|
||||||
|
UserController *controller.UserController
|
||||||
|
ResourcesController *controller.ResourcesController
|
||||||
|
HealthController *controller.HealthController
|
||||||
|
WellKnownController *controller.WellKnownController
|
||||||
|
}
|
||||||
|
|
||||||
|
// force dig to build all controllers and register their routes
|
||||||
|
err = app.dig.Invoke(func(ci controllerInput) error {
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to invoke controllers: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
app.router = engine
|
app.router = engine
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -9,19 +9,46 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (app *BootstrapApp) setupServices() error {
|
func (app *BootstrapApp) setupServices() error {
|
||||||
app.setupPolicyEngine()
|
err := app.setupPolicyEngine()
|
||||||
|
|
||||||
app.dig.Provide(func() *service.PolicyEngine {
|
if err != nil {
|
||||||
return app.services.policyEngine
|
return fmt.Errorf("failed to setup policy engine: %w", err)
|
||||||
})
|
}
|
||||||
|
|
||||||
app.dig.Provide(app.getLabelProvider)
|
err = app.dig.Provide(app.getLabelProvider)
|
||||||
app.dig.Provide(service.NewLdapService)
|
if err != nil {
|
||||||
app.dig.Provide(service.NewTailscaleService)
|
return fmt.Errorf("failed to provide label provider: %w", err)
|
||||||
app.dig.Provide(service.NewAccessControlsService)
|
}
|
||||||
app.dig.Provide(service.NewOAuthBrokerService)
|
|
||||||
app.dig.Provide(service.NewAuthService)
|
err = app.dig.Provide(service.NewLdapService)
|
||||||
app.dig.Provide(service.NewOIDCService)
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide ldap service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(service.NewTailscaleService)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide tailscale service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(service.NewAccessControlsService)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide access controls service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(service.NewOAuthBrokerService)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide oauth broker service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(service.NewAuthService)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide auth service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Provide(service.NewOIDCService)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to provide oidc service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
type svcInput struct {
|
type svcInput struct {
|
||||||
dig.In
|
dig.In
|
||||||
@@ -34,7 +61,7 @@ func (app *BootstrapApp) setupServices() error {
|
|||||||
TailscaleService *service.TailscaleService
|
TailscaleService *service.TailscaleService
|
||||||
}
|
}
|
||||||
|
|
||||||
err := app.dig.Invoke(func(i svcInput) error {
|
err = app.dig.Invoke(func(i svcInput) error {
|
||||||
app.services = Services{
|
app.services = Services{
|
||||||
accessControlService: i.AccessControlService,
|
accessControlService: i.AccessControlService,
|
||||||
authService: i.AuthService,
|
authService: i.AuthService,
|
||||||
@@ -45,7 +72,11 @@ func (app *BootstrapApp) setupServices() error {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
return err
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to invoke services: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
|
func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
|
||||||
@@ -61,25 +92,41 @@ func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
|
|||||||
if useKubernetes {
|
if useKubernetes {
|
||||||
app.log.App.Debug().Msg("Using Kubernetes label provider")
|
app.log.App.Debug().Msg("Using Kubernetes label provider")
|
||||||
|
|
||||||
app.dig.Provide(service.NewKubernetesService)
|
err := app.dig.Provide(service.NewKubernetesService)
|
||||||
|
|
||||||
app.dig.Invoke(func(k *service.KubernetesService) error {
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to provide kubernetes service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Invoke(func(k *service.KubernetesService) error {
|
||||||
app.services.kubernetesService = k
|
app.services.kubernetesService = k
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to invoke kubernetes service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return app.services.kubernetesService, nil
|
return app.services.kubernetesService, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
app.log.App.Debug().Msg("Using Docker label provider")
|
app.log.App.Debug().Msg("Using Docker label provider")
|
||||||
|
|
||||||
app.dig.Provide(service.NewDockerService)
|
err := app.dig.Provide(service.NewDockerService)
|
||||||
|
|
||||||
app.dig.Invoke(func(d *service.DockerService) error {
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to provide docker service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Invoke(func(d *service.DockerService) error {
|
||||||
app.services.dockerService = d
|
app.services.dockerService = d
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to invoke docker service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
if app.services.dockerService == nil {
|
if app.services.dockerService == nil {
|
||||||
if app.config.LabelProvider == "docker" {
|
if app.config.LabelProvider == "docker" {
|
||||||
app.log.App.Warn().Msg("Docker label provider selected but Docker is not available, will continue without it")
|
app.log.App.Warn().Msg("Docker label provider selected but Docker is not available, will continue without it")
|
||||||
@@ -93,10 +140,14 @@ func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *BootstrapApp) setupPolicyEngine() {
|
func (app *BootstrapApp) setupPolicyEngine() error {
|
||||||
app.dig.Provide(service.NewPolicyEngine)
|
err := app.dig.Provide(service.NewPolicyEngine)
|
||||||
|
|
||||||
app.dig.Invoke(func(policyEngine *service.PolicyEngine) error {
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to create policy engine: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.dig.Invoke(func(policyEngine *service.PolicyEngine) error {
|
||||||
policyEngine.RegisterRule(service.RuleUserAllowed, &service.UserAllowedRule{
|
policyEngine.RegisterRule(service.RuleUserAllowed, &service.UserAllowedRule{
|
||||||
Log: app.log,
|
Log: app.log,
|
||||||
})
|
})
|
||||||
@@ -119,4 +170,6 @@ func (app *BootstrapApp) setupPolicyEngine() {
|
|||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package controller
|
|||||||
import (
|
import (
|
||||||
"github.com/tinyauthapp/tinyauth/internal/model"
|
"github.com/tinyauthapp/tinyauth/internal/model"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
@@ -71,29 +72,33 @@ type AppContextResponse struct {
|
|||||||
App ACRApp `json:"app"`
|
App ACRApp `json:"app"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContextController struct {
|
type ContextControllerInput struct {
|
||||||
log *logger.Logger
|
dig.In
|
||||||
config model.Config
|
|
||||||
runtime model.RuntimeConfig
|
Log *logger.Logger
|
||||||
|
Config *model.Config
|
||||||
|
Runtime *model.RuntimeConfig
|
||||||
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewContextController(
|
type ContextController struct {
|
||||||
log *logger.Logger,
|
log *logger.Logger
|
||||||
config model.Config,
|
config *model.Config
|
||||||
runtimeConfig model.RuntimeConfig,
|
runtime *model.RuntimeConfig
|
||||||
router *gin.RouterGroup,
|
}
|
||||||
) *ContextController {
|
|
||||||
|
func NewContextController(i ContextControllerInput) *ContextController {
|
||||||
controller := &ContextController{
|
controller := &ContextController{
|
||||||
log: log,
|
log: i.Log,
|
||||||
config: config,
|
config: i.Config,
|
||||||
runtime: runtimeConfig,
|
runtime: i.Runtime,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !config.UI.WarningsEnabled {
|
if !i.Config.UI.WarningsEnabled {
|
||||||
log.App.Warn().Msg("UI warnings are disabled. This may lead to security issues if you are not careful. Make sure to enable warnings in production environments.")
|
i.Log.App.Warn().Msg("UI warnings are disabled. This may lead to security issues if you are not careful. Make sure to enable warnings in production environments.")
|
||||||
}
|
}
|
||||||
|
|
||||||
contextGroup := router.Group("/context")
|
contextGroup := i.RouterGroup.Group("/context")
|
||||||
contextGroup.GET("/user", controller.userContextHandler)
|
contextGroup.GET("/user", controller.userContextHandler)
|
||||||
contextGroup.GET("/app", controller.appContextHandler)
|
contextGroup.GET("/app", controller.appContextHandler)
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,24 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import "github.com/gin-gonic/gin"
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
)
|
||||||
|
|
||||||
type HealthController struct {
|
type HealthController struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHealthController(router *gin.RouterGroup) *HealthController {
|
type HealthControllerInput struct {
|
||||||
|
dig.In
|
||||||
|
|
||||||
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHealthController(i HealthControllerInput) *HealthController {
|
||||||
controller := &HealthController{}
|
controller := &HealthController{}
|
||||||
|
|
||||||
router.GET("/healthz", controller.healthHandler)
|
i.RouterGroup.GET("/healthz", controller.healthHandler)
|
||||||
router.HEAD("/healthz", controller.healthHandler)
|
i.RouterGroup.HEAD("/healthz", controller.healthHandler)
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/tinyauthapp/tinyauth/internal/service"
|
"github.com/tinyauthapp/tinyauth/internal/service"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils"
|
"github.com/tinyauthapp/tinyauth/internal/utils"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
@@ -22,26 +23,30 @@ type OAuthRequest struct {
|
|||||||
|
|
||||||
type OAuthController struct {
|
type OAuthController struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
config model.Config
|
config *model.Config
|
||||||
runtime model.RuntimeConfig
|
runtime *model.RuntimeConfig
|
||||||
auth *service.AuthService
|
auth *service.AuthService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewOAuthController(
|
type OAuthControllerInput struct {
|
||||||
log *logger.Logger,
|
dig.In
|
||||||
config model.Config,
|
|
||||||
runtimeConfig model.RuntimeConfig,
|
Log *logger.Logger
|
||||||
router *gin.RouterGroup,
|
Config *model.Config
|
||||||
auth *service.AuthService,
|
RuntimeConfig *model.RuntimeConfig
|
||||||
) *OAuthController {
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
|
AuthService *service.AuthService
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOAuthController(i OAuthControllerInput) *OAuthController {
|
||||||
controller := &OAuthController{
|
controller := &OAuthController{
|
||||||
log: log,
|
log: i.Log,
|
||||||
config: config,
|
config: i.Config,
|
||||||
runtime: runtimeConfig,
|
runtime: i.RuntimeConfig,
|
||||||
auth: auth,
|
auth: i.AuthService,
|
||||||
}
|
}
|
||||||
|
|
||||||
oauthGroup := router.Group("/oauth")
|
oauthGroup := i.RouterGroup.Group("/oauth")
|
||||||
oauthGroup.GET("/url/:provider", controller.oauthURLHandler)
|
oauthGroup.GET("/url/:provider", controller.oauthURLHandler)
|
||||||
oauthGroup.GET("/callback/:provider", controller.oauthCallbackHandler)
|
oauthGroup.GET("/callback/:provider", controller.oauthCallbackHandler)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gin-gonic/gin/binding"
|
"github.com/gin-gonic/gin/binding"
|
||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/tinyauthapp/tinyauth/internal/model"
|
"github.com/tinyauthapp/tinyauth/internal/model"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/service"
|
"github.com/tinyauthapp/tinyauth/internal/service"
|
||||||
@@ -30,7 +31,7 @@ type authorizeErrorParams struct {
|
|||||||
type OIDCController struct {
|
type OIDCController struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
oidc *service.OIDCService
|
oidc *service.OIDCService
|
||||||
runtime model.RuntimeConfig
|
runtime *model.RuntimeConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
type AuthorizeCallback struct {
|
type AuthorizeCallback struct {
|
||||||
@@ -78,22 +79,27 @@ type AuthorizeCompleteRequest struct {
|
|||||||
Ticket string `json:"ticket" binding:"required"`
|
Ticket string `json:"ticket" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewOIDCController(
|
type OIDCControllerInput struct {
|
||||||
log *logger.Logger,
|
dig.In
|
||||||
oidcService *service.OIDCService,
|
|
||||||
runtimeConfig model.RuntimeConfig,
|
Log *logger.Logger
|
||||||
router *gin.RouterGroup,
|
OIDCService *service.OIDCService
|
||||||
mainRouter *gin.RouterGroup) *OIDCController {
|
RuntimeConfig *model.RuntimeConfig
|
||||||
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
|
MainRouter *gin.RouterGroup `name:"mainRouterGroup"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOIDCController(i OIDCControllerInput) *OIDCController {
|
||||||
controller := &OIDCController{
|
controller := &OIDCController{
|
||||||
log: log,
|
log: i.Log,
|
||||||
oidc: oidcService,
|
oidc: i.OIDCService,
|
||||||
runtime: runtimeConfig,
|
runtime: i.RuntimeConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
mainRouter.POST("/authorize", controller.authorize)
|
i.MainRouter.POST("/authorize", controller.authorize)
|
||||||
mainRouter.GET("/authorize", controller.authorize)
|
i.MainRouter.GET("/authorize", controller.authorize)
|
||||||
|
|
||||||
oidcGroup := router.Group("/oidc")
|
oidcGroup := i.RouterGroup.Group("/oidc")
|
||||||
oidcGroup.POST("/authorize-complete", controller.authorizeComplete)
|
oidcGroup.POST("/authorize-complete", controller.authorizeComplete)
|
||||||
oidcGroup.POST("/token", controller.Token)
|
oidcGroup.POST("/token", controller.Token)
|
||||||
oidcGroup.GET("/userinfo", controller.Userinfo)
|
oidcGroup.GET("/userinfo", controller.Userinfo)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/tinyauthapp/tinyauth/internal/service"
|
"github.com/tinyauthapp/tinyauth/internal/service"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils"
|
"github.com/tinyauthapp/tinyauth/internal/utils"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/google/go-querystring/query"
|
"github.com/google/go-querystring/query"
|
||||||
@@ -53,29 +54,33 @@ type ProxyContext struct {
|
|||||||
|
|
||||||
type ProxyController struct {
|
type ProxyController struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
runtime model.RuntimeConfig
|
runtime *model.RuntimeConfig
|
||||||
acls *service.AccessControlsService
|
acls *service.AccessControlsService
|
||||||
auth *service.AuthService
|
auth *service.AuthService
|
||||||
policyEngine *service.PolicyEngine
|
policyEngine *service.PolicyEngine
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProxyController(
|
type ProxyControllerInput struct {
|
||||||
log *logger.Logger,
|
dig.In
|
||||||
runtime model.RuntimeConfig,
|
|
||||||
router *gin.RouterGroup,
|
Log *logger.Logger
|
||||||
acls *service.AccessControlsService,
|
RuntimeConfig *model.RuntimeConfig
|
||||||
auth *service.AuthService,
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
policyEngine *service.PolicyEngine,
|
ACLsService *service.AccessControlsService
|
||||||
) *ProxyController {
|
AuthService *service.AuthService
|
||||||
|
PolicyEngine *service.PolicyEngine
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProxyController(i ProxyControllerInput) *ProxyController {
|
||||||
controller := &ProxyController{
|
controller := &ProxyController{
|
||||||
log: log,
|
log: i.Log,
|
||||||
runtime: runtime,
|
runtime: i.RuntimeConfig,
|
||||||
acls: acls,
|
acls: i.ACLsService,
|
||||||
auth: auth,
|
auth: i.AuthService,
|
||||||
policyEngine: policyEngine,
|
policyEngine: i.PolicyEngine,
|
||||||
}
|
}
|
||||||
|
|
||||||
proxyGroup := router.Group("/auth")
|
proxyGroup := i.RouterGroup.Group("/auth")
|
||||||
proxyGroup.Any("/:proxy", controller.proxyHandler)
|
proxyGroup.Any("/:proxy", controller.proxyHandler)
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
|
|||||||
@@ -5,25 +5,30 @@ import (
|
|||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/model"
|
"github.com/tinyauthapp/tinyauth/internal/model"
|
||||||
|
"go.uber.org/dig"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ResourcesController struct {
|
type ResourcesController struct {
|
||||||
config model.Config
|
config *model.Config
|
||||||
fileServer http.Handler
|
fileServer http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewResourcesController(
|
type ResourcesControllerInput struct {
|
||||||
config model.Config,
|
dig.In
|
||||||
router *gin.RouterGroup,
|
|
||||||
) *ResourcesController {
|
RouterGroup *gin.RouterGroup `name:"mainRouterGroup"`
|
||||||
fileServer := http.StripPrefix("/resources", http.FileServer(http.Dir(config.Resources.Path)))
|
Config *model.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewResourcesController(i ResourcesControllerInput) *ResourcesController {
|
||||||
|
fileServer := http.StripPrefix("/resources", http.FileServer(http.Dir(i.Config.Resources.Path)))
|
||||||
|
|
||||||
controller := &ResourcesController{
|
controller := &ResourcesController{
|
||||||
config: config,
|
config: i.Config,
|
||||||
fileServer: fileServer,
|
fileServer: fileServer,
|
||||||
}
|
}
|
||||||
|
|
||||||
router.GET("/resources/*resource", controller.resourcesHandler)
|
i.RouterGroup.GET("/resources/*resource", controller.resourcesHandler)
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/tinyauthapp/tinyauth/internal/service"
|
"github.com/tinyauthapp/tinyauth/internal/service"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils"
|
"github.com/tinyauthapp/tinyauth/internal/utils"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/pquerna/otp/totp"
|
"github.com/pquerna/otp/totp"
|
||||||
@@ -27,23 +28,27 @@ type TotpRequest struct {
|
|||||||
|
|
||||||
type UserController struct {
|
type UserController struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
runtime model.RuntimeConfig
|
runtime *model.RuntimeConfig
|
||||||
auth *service.AuthService
|
auth *service.AuthService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUserController(
|
type UserControllerInput struct {
|
||||||
log *logger.Logger,
|
dig.In
|
||||||
runtimeConfig model.RuntimeConfig,
|
|
||||||
router *gin.RouterGroup,
|
Log *logger.Logger
|
||||||
auth *service.AuthService,
|
RuntimeConfig *model.RuntimeConfig
|
||||||
) *UserController {
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
|
AuthService *service.AuthService
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserController(i UserControllerInput) *UserController {
|
||||||
controller := &UserController{
|
controller := &UserController{
|
||||||
log: log,
|
log: i.Log,
|
||||||
runtime: runtimeConfig,
|
runtime: i.RuntimeConfig,
|
||||||
auth: auth,
|
auth: i.AuthService,
|
||||||
}
|
}
|
||||||
|
|
||||||
userGroup := router.Group("/user")
|
userGroup := i.RouterGroup.Group("/user")
|
||||||
userGroup.POST("/login", controller.loginHandler)
|
userGroup.POST("/login", controller.loginHandler)
|
||||||
userGroup.POST("/logout", controller.logoutHandler)
|
userGroup.POST("/logout", controller.logoutHandler)
|
||||||
userGroup.POST("/totp", controller.totpHandler)
|
userGroup.POST("/totp", controller.totpHandler)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/service"
|
"github.com/tinyauthapp/tinyauth/internal/service"
|
||||||
|
"go.uber.org/dig"
|
||||||
)
|
)
|
||||||
|
|
||||||
type OpenIDConnectConfiguration struct {
|
type OpenIDConnectConfiguration struct {
|
||||||
@@ -30,13 +31,20 @@ type WellKnownController struct {
|
|||||||
oidc *service.OIDCService
|
oidc *service.OIDCService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWellKnownController(oidc *service.OIDCService, router *gin.RouterGroup) *WellKnownController {
|
type WellKnownControllerInput struct {
|
||||||
|
dig.In
|
||||||
|
|
||||||
|
OIDCService *service.OIDCService
|
||||||
|
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWellKnownController(i WellKnownControllerInput) *WellKnownController {
|
||||||
controller := &WellKnownController{
|
controller := &WellKnownController{
|
||||||
oidc: oidc,
|
oidc: i.OIDCService,
|
||||||
}
|
}
|
||||||
|
|
||||||
router.GET("/.well-known/openid-configuration", controller.OpenIDConnectConfiguration)
|
i.RouterGroup.GET("/.well-known/openid-configuration", controller.OpenIDConnectConfiguration)
|
||||||
router.GET("/.well-known/jwks.json", controller.JWKS)
|
i.RouterGroup.GET("/.well-known/jwks.json", controller.JWKS)
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/tinyauthapp/tinyauth/internal/service"
|
"github.com/tinyauthapp/tinyauth/internal/service"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils"
|
"github.com/tinyauthapp/tinyauth/internal/utils"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
@@ -37,25 +38,29 @@ var (
|
|||||||
|
|
||||||
type ContextMiddleware struct {
|
type ContextMiddleware struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
runtime model.RuntimeConfig
|
runtime *model.RuntimeConfig
|
||||||
auth *service.AuthService
|
auth *service.AuthService
|
||||||
broker *service.OAuthBrokerService
|
broker *service.OAuthBrokerService
|
||||||
tailscale *service.TailscaleService
|
tailscale *service.TailscaleService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewContextMiddleware(
|
type ContextMiddlewareInput struct {
|
||||||
log *logger.Logger,
|
dig.In
|
||||||
runtime model.RuntimeConfig,
|
|
||||||
auth *service.AuthService,
|
Log *logger.Logger
|
||||||
broker *service.OAuthBrokerService,
|
RuntimeConfig *model.RuntimeConfig
|
||||||
tailscale *service.TailscaleService,
|
AuthService *service.AuthService
|
||||||
) *ContextMiddleware {
|
BrokerService *service.OAuthBrokerService
|
||||||
|
TailscaleService *service.TailscaleService
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewContextMiddleware(i ContextMiddlewareInput) *ContextMiddleware {
|
||||||
return &ContextMiddleware{
|
return &ContextMiddleware{
|
||||||
log: log,
|
log: i.Log,
|
||||||
runtime: runtime,
|
runtime: i.RuntimeConfig,
|
||||||
auth: auth,
|
auth: i.AuthService,
|
||||||
broker: broker,
|
broker: i.BrokerService,
|
||||||
tailscale: tailscale,
|
tailscale: i.TailscaleService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/tinyauthapp/tinyauth/internal/assets"
|
"github.com/tinyauthapp/tinyauth/internal/assets"
|
||||||
|
"go.uber.org/dig"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
@@ -18,7 +19,12 @@ type UIMiddleware struct {
|
|||||||
uiFileServer http.Handler
|
uiFileServer http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUIMiddleware() (*UIMiddleware, error) {
|
// for future use if we need to inject dependencies into the middleware
|
||||||
|
type UIMiddlewareInput struct {
|
||||||
|
dig.In
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUIMiddleware(_ UIMiddlewareInput) (*UIMiddleware, error) {
|
||||||
m := &UIMiddleware{}
|
m := &UIMiddleware{}
|
||||||
|
|
||||||
ui, err := fs.Sub(assets.FrontendAssets, "dist")
|
ui, err := fs.Sub(assets.FrontendAssets, "dist")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
"github.com/tinyauthapp/tinyauth/internal/utils/logger"
|
||||||
|
"go.uber.org/dig"
|
||||||
)
|
)
|
||||||
|
|
||||||
// See context middleware for explanation of why we have to do this
|
// See context middleware for explanation of why we have to do this
|
||||||
@@ -21,9 +22,15 @@ type ZerologMiddleware struct {
|
|||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewZerologMiddleware(log *logger.Logger) *ZerologMiddleware {
|
type ZerologMiddlewareInput struct {
|
||||||
|
dig.In
|
||||||
|
|
||||||
|
Log *logger.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewZerologMiddleware(i ZerologMiddlewareInput) *ZerologMiddleware {
|
||||||
return &ZerologMiddleware{
|
return &ZerologMiddleware{
|
||||||
log: log,
|
log: i.Log,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user