package user import ( "embed" "fmt" "github.com/go-chi/chi/v5" "github.com/go-chi/jwtauth/v5" "github.com/unrolled/render" "net/http" "time" ) // content holds our static web server content. //go:embed templates/* var webserver embed.FS var ren *render.Render var tokenAuth *jwtauth.JWTAuth type UserConfig struct { RequiredMailValidationBeforeLogin bool } func NewConfig() UserConfig { u := UserConfig{ RequiredMailValidationBeforeLogin: true, } return u } func Register(router chi.Router, token *jwtauth.JWTAuth, config UserConfig) { ren = render.New(render.Options{ //Layout: "layout", FileSystem: &render.EmbedFileSystem{ FS: webserver, }, }) router.Get("/login", loginForm) router.Post("/login", login) router.Get("/register", registerForm) router.Post("/register", register) router.Get("/logout", logout) //tokenAuth = jwtauth.New("HS256", []byte("secret"), nil) tokenAuth = token router.Group(func(r chi.Router) { r.Use(jwtauth.Verifier(tokenAuth)) r.Get("/me", func(w http.ResponseWriter, r *http.Request) { _, claims, _ := jwtauth.FromContext(r.Context()) if val, ok := claims["username"]; ok { w.Write([]byte(fmt.Sprintf("hi %v", val))) } else { w.Write([]byte("Du bist nicht eingeloggt")) } }) }) } func loginForm(w http.ResponseWriter, r *http.Request) { ren.HTML(w, http.StatusOK, "login", nil) } func registerForm(w http.ResponseWriter, r *http.Request) { ren.HTML(w, http.StatusOK, "register", nil) } func login(w http.ResponseWriter, r *http.Request) { r.ParseForm() uc := GetUserClient() res, _ := uc.login(r.FormValue("username"), r.FormValue("password")) if res { _, tokenstring, err := tokenAuth.Encode(map[string]interface{}{"username": r.FormValue("username")}) if err != nil { panic(err) } expiration := time.Now().Add(365 * 24 * time.Hour) cookie := http.Cookie{Name: "jwt",Value:tokenstring,Expires:expiration} http.SetCookie(w, &cookie) w.Write([]byte("Login ok")) } else { w.Write([]byte("Login failed")) } } func logout(w http.ResponseWriter, r *http.Request) { cookie := http.Cookie{ Name: "jwt", Value: "", } http.SetCookie(w, &cookie) w.Write([]byte("Du wurdest ausgeloggt")) } func register(w http.ResponseWriter, r *http.Request) { r.ParseForm() uc := GetUserClient() res, _ := uc.register(r.FormValue("username"), r.FormValue("password"), r.FormValue("email")) if res { w.Write([]byte("Register ok")) } else { w.Write([]byte("Register failed")) } }