✨ Sign up & Sign in
This commit is contained in:
		| @@ -1,26 +0,0 @@ | ||||
| package ui | ||||
|  | ||||
| import ( | ||||
| 	"github.com/gofiber/fiber/v2" | ||||
| 	"github.com/nicksnyder/go-i18n/v2/i18n" | ||||
| ) | ||||
|  | ||||
| func signinPage(c *fiber.Ctx) error { | ||||
| 	localizer := c.Locals("localizer").(*i18n.Localizer) | ||||
|  | ||||
| 	next, _ := localizer.LocalizeMessage(&i18n.Message{ID: "next"}) | ||||
| 	username, _ := localizer.LocalizeMessage(&i18n.Message{ID: "username"}) | ||||
| 	password, _ := localizer.LocalizeMessage(&i18n.Message{ID: "password"}) | ||||
| 	title, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signinTitle"}) | ||||
| 	caption, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signinCaption"}) | ||||
|  | ||||
| 	return c.Render("views/signin", fiber.Map{ | ||||
| 		"i18n": fiber.Map{ | ||||
| 			"next":     next, | ||||
| 			"username": username, | ||||
| 			"password": password, | ||||
| 			"title":    title, | ||||
| 			"caption":  caption, | ||||
| 		}, | ||||
| 	}, "views/layouts/auth") | ||||
| } | ||||
| @@ -4,5 +4,10 @@ import "github.com/gofiber/fiber/v2" | ||||
|  | ||||
| func MapUserInterface(A *fiber.App) { | ||||
| 	pages := A.Group("/").Name("Pages") | ||||
|  | ||||
| 	pages.Get("/sign-up", signupPage) | ||||
| 	pages.Get("/sign-in", signinPage) | ||||
|  | ||||
| 	pages.Post("/sign-up", signupAction) | ||||
| 	pages.Post("/sign-in", signinAction) | ||||
| } | ||||
|   | ||||
							
								
								
									
										77
									
								
								pkg/server/ui/signin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								pkg/server/ui/signin.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| package ui | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/services" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/utils" | ||||
| 	"github.com/gofiber/fiber/v2" | ||||
| 	"github.com/nicksnyder/go-i18n/v2/i18n" | ||||
| 	"github.com/sujit-baniya/flash" | ||||
| ) | ||||
|  | ||||
| func signinPage(c *fiber.Ctx) error { | ||||
| 	localizer := c.Locals("localizer").(*i18n.Localizer) | ||||
|  | ||||
| 	next, _ := localizer.LocalizeMessage(&i18n.Message{ID: "next"}) | ||||
| 	username, _ := localizer.LocalizeMessage(&i18n.Message{ID: "username"}) | ||||
| 	password, _ := localizer.LocalizeMessage(&i18n.Message{ID: "password"}) | ||||
| 	signup, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signupTitle"}) | ||||
| 	title, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signinTitle"}) | ||||
| 	caption, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signinCaption"}) | ||||
|  | ||||
| 	return c.Render("views/signin", fiber.Map{ | ||||
| 		"info": flash.Get(c)["message"], | ||||
| 		"i18n": fiber.Map{ | ||||
| 			"next":     next, | ||||
| 			"username": username, | ||||
| 			"password": password, | ||||
| 			"signup":   signup, | ||||
| 			"title":    title, | ||||
| 			"caption":  caption, | ||||
| 		}, | ||||
| 	}, "views/layouts/auth") | ||||
| } | ||||
|  | ||||
| func signinAction(c *fiber.Ctx) error { | ||||
| 	var data struct { | ||||
| 		Username string `form:"username" validate:"required"` | ||||
| 		Password string `form:"password" validate:"required"` | ||||
| 	} | ||||
|  | ||||
| 	if err := utils.BindAndValidate(c, &data); err != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": err.Error(), | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} | ||||
|  | ||||
| 	user, err := services.LookupAccount(data.Username) | ||||
| 	if err != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": fmt.Sprintf("account was not found: %v", err.Error()), | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} | ||||
|  | ||||
| 	ticket, err := services.NewTicket(user, c.IP(), c.Get(fiber.HeaderUserAgent)) | ||||
| 	if err != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": fmt.Sprintf("unable setup ticket: %v", err.Error()), | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} | ||||
|  | ||||
| 	ticket, err = services.ActiveTicketWithPassword(ticket, data.Password) | ||||
| 	if err != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": fmt.Sprintf("invalid password: %v", err.Error()), | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} | ||||
|  | ||||
| 	if ticket.IsAvailable() != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": "multi factor authenticate required", | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} else { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": "done", | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										86
									
								
								pkg/server/ui/signup.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								pkg/server/ui/signup.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| package ui | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/database" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/models" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/services" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/utils" | ||||
| 	"github.com/gofiber/fiber/v2" | ||||
| 	"github.com/nicksnyder/go-i18n/v2/i18n" | ||||
| 	"github.com/spf13/viper" | ||||
| 	"github.com/sujit-baniya/flash" | ||||
| ) | ||||
|  | ||||
| func signupPage(c *fiber.Ctx) error { | ||||
| 	localizer := c.Locals("localizer").(*i18n.Localizer) | ||||
|  | ||||
| 	next, _ := localizer.LocalizeMessage(&i18n.Message{ID: "next"}) | ||||
| 	email, _ := localizer.LocalizeMessage(&i18n.Message{ID: "email"}) | ||||
| 	nickname, _ := localizer.LocalizeMessage(&i18n.Message{ID: "nickname"}) | ||||
| 	username, _ := localizer.LocalizeMessage(&i18n.Message{ID: "username"}) | ||||
| 	password, _ := localizer.LocalizeMessage(&i18n.Message{ID: "password"}) | ||||
| 	magicToken, _ := localizer.LocalizeMessage(&i18n.Message{ID: "magicToken"}) | ||||
| 	signin, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signinTitle"}) | ||||
| 	title, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signupTitle"}) | ||||
| 	caption, _ := localizer.LocalizeMessage(&i18n.Message{ID: "signupCaption"}) | ||||
|  | ||||
| 	return c.Render("views/signup", fiber.Map{ | ||||
| 		"info":            flash.Get(c)["message"], | ||||
| 		"use_magic_token": viper.GetBool("use_registration_magic_token"), | ||||
| 		"i18n": fiber.Map{ | ||||
| 			"next":        next, | ||||
| 			"email":       email, | ||||
| 			"username":    username, | ||||
| 			"nickname":    nickname, | ||||
| 			"password":    password, | ||||
| 			"magic_token": magicToken, | ||||
| 			"signin":      signin, | ||||
| 			"title":       title, | ||||
| 			"caption":     caption, | ||||
| 		}, | ||||
| 	}, "views/layouts/auth") | ||||
| } | ||||
|  | ||||
| func signupAction(c *fiber.Ctx) error { | ||||
| 	var data struct { | ||||
| 		Name       string `form:"name" validate:"required,lowercase,alphanum,min=4,max=16"` | ||||
| 		Nick       string `form:"nick" validate:"required,min=4,max=24"` | ||||
| 		Email      string `form:"email" validate:"required,email"` | ||||
| 		Password   string `form:"password" validate:"required,min=4,max=32"` | ||||
| 		MagicToken string `form:"magic_token"` | ||||
| 	} | ||||
|  | ||||
| 	if err := utils.BindAndValidate(c, &data); err != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": err.Error(), | ||||
| 		}).Redirect("/sign-up") | ||||
| 	} else if viper.GetBool("use_registration_magic_token") && len(data.MagicToken) <= 0 { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": "magic token was required", | ||||
| 		}).Redirect("/sign-up") | ||||
| 	} else if viper.GetBool("use_registration_magic_token") { | ||||
| 		if tk, err := services.ValidateMagicToken(data.MagicToken, models.RegistrationMagicToken); err != nil { | ||||
| 			return flash.WithInfo(c, fiber.Map{ | ||||
| 				"message": fmt.Sprintf("magic token was invalid: %v", err.Error()), | ||||
| 			}).Redirect("/sign-up") | ||||
| 		} else { | ||||
| 			database.C.Delete(&tk) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if _, err := services.CreateAccount( | ||||
| 		data.Name, | ||||
| 		data.Nick, | ||||
| 		data.Email, | ||||
| 		data.Password, | ||||
| 	); err != nil { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": err.Error(), | ||||
| 		}).Redirect("/sign-up") | ||||
| 	} else { | ||||
| 		return flash.WithInfo(c, fiber.Map{ | ||||
| 			"message": "account has been created. now you can sign in!", | ||||
| 		}).Redirect("/sign-in") | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user