Skip to content
Snippets Groups Projects
program_auth.go 1.6 KiB
Newer Older
	"github.com/justinas/alice"
func WithTokenOptions[E any]() Option[E] {
	return func(program *Program[E]) {
		program.TokenOptions = auth.NewTokenOptions(
			program.Name,
			func() *zerolog.Logger {
				return &program.Logger
			},
		)
		if _, err := program.Parser.AddGroup("Token", "Token Options", program.TokenOptions); err != nil {
			panic(err)
		}

		SetupGenerateAuthSecretCmd(program)
	}
}

func WithAuthMiddleware[E any](middleware any) Option[E] {
	return func(program *Program[E]) {
		program.authMiddlewares = append(program.authMiddlewares, getMiddleware[E](middleware))
	}
}

func WithCookieMiddleware[E any, T any, PT interface {
	*T
	auth.Claims
}]() Option[E] {
	return WithAuthMiddleware[E](
		func(program *Program[E]) (alice.Constructor, error) {
			return auth.CookieMiddleware[T, PT](program.TokenOptions), nil
		},
	)
}

type GenerateAuthSecretCmd[E any] struct {
	program *Program[E]
}

func (cmd *GenerateAuthSecretCmd[E]) Execute([]string) error {
	secret := make([]byte, 32)
	if _, err := rand.Read(secret); err != nil {
		panic(err)
	}

	_, err := fmt.Println(hex.EncodeToString(secret))

	return err
}

func SetupGenerateAuthSecretCmd[E any](program *Program[E]) *GenerateAuthSecretCmd[E] {
	cmd := GenerateAuthSecretCmd[E]{
		program: program,
	}

	if _, err := program.Parser.AddCommand(
		"generate-auth-secret", "Generate a proper auth secret", "", &cmd,
	); err != nil {
		program.Logger.Fatal().Err(err).Msg("could not init generate-auth-secret command")
	}

	return &cmd
}