Newer
Older
package cmd
import (
"crypto/rand"
"encoding/hex"
"fmt"
"github.com/justinas/alice"
"github.com/rs/zerolog"
"orus.io/orus-io/go-orusapi/auth"
)
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
}