package main import ( "fmt" "log/slog" "net/http" "os" "git.christmann.info/LARA/zitadel-oidc/v3/example/server/config" "git.christmann.info/LARA/zitadel-oidc/v3/example/server/exampleop" "git.christmann.info/LARA/zitadel-oidc/v3/example/server/storage" ) func getUserStore(cfg *config.Config) (storage.UserStore, error) { if cfg.UsersFile == "" { return storage.NewUserStore(fmt.Sprintf("http://localhost:%s/", cfg.Port)), nil } return storage.StoreFromFile(cfg.UsersFile) } func main() { cfg := config.FromEnvVars(&config.Config{Port: "9998"}) logger := slog.New( slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ AddSource: true, Level: slog.LevelDebug, }), ) //which gives us the issuer: http://localhost:9998/ issuer := fmt.Sprintf("http://localhost:%s/", cfg.Port) storage.RegisterClients( storage.NativeClient("native", cfg.RedirectURI...), storage.WebClient("web", "secret", cfg.RedirectURI...), storage.WebClient("api", "secret", cfg.RedirectURI...), ) // the OpenIDProvider interface needs a Storage interface handling various checks and state manipulations // this might be the layer for accessing your database // in this example it will be handled in-memory store, err := getUserStore(cfg) if err != nil { logger.Error("cannot create UserStore", "error", err) os.Exit(1) } storage := storage.NewStorage(store) router := exampleop.SetupServer(issuer, storage, logger, false) server := &http.Server{ Addr: ":" + cfg.Port, Handler: router, } logger.Info("server listening, press ctrl+c to stop", "addr", issuer) if server.ListenAndServe() != http.ErrServerClosed { logger.Error("server terminated", "error", err) os.Exit(1) } }