This repository has been archived on 2025-10-08. You can view files and clone it, but cannot push or open issues or pull requests.
miniauthold/pkg/web/web.go
kekskurse 92704e80f1
All checks were successful
ci/woodpecker/push/test Pipeline was successful
ci/woodpecker/push/playwright Pipeline was successful
ci/woodpecker/push/deplyoment Pipeline was successful
fix: go mod oauth test
2025-05-25 20:49:24 +02:00

108 lines
2.6 KiB
Go

package web
import (
"errors"
"net/http"
"time"
"git.keks.cloud/kekskurse/miniauth/pkg/miniauth"
"git.keks.cloud/kekskurse/miniauth/pkg/userstore"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt/v5"
)
type WebConfig struct {
PublicRegistration bool `env:"PUBLIC_REGISTRATION, default=0"`
JWT_SECRET_KEY string `env:"JWT_SECRET_KEY, default=abc"`
}
type Web struct {
config WebConfig
ma miniauth.Miniauth
}
func NewWeb(config WebConfig, ma miniauth.Miniauth) Web {
w := Web{}
w.config = config
w.ma = ma
return w
}
func (w Web) RegisterRoutes(routing *gin.RouterGroup) error {
routing.GET("/register", w.GetRegisterPage)
routing.POST("/register", w.PostRegisterPage)
routing.GET("/login", w.GetLoginPage)
routing.POST("/login", w.PostLoginPage)
return nil
}
func (w Web) GetRegisterPage(c *gin.Context) {
if !w.config.PublicRegistration {
c.HTML(403, "msg.html", gin.H{"msg": "Public registration disabled"})
return
}
c.HTML(http.StatusOK, "register.html", nil)
}
func (w Web) PostRegisterPage(c *gin.Context) {
if !w.config.PublicRegistration {
c.HTML(403, "msg.html", gin.H{"msg": "Public registration disabled"})
return
}
if c.PostForm("password") != c.PostForm("confirm_password") {
c.HTML(http.StatusOK, "register.html", gin.H{"msg": "Passworts dont match"})
return
}
err := w.ma.RegisterUser(c.PostForm("username"), c.PostForm("email"), c.PostForm("password"))
if err != nil {
c.HTML(http.StatusOK, "register.html", gin.H{"msg": err.Error()})
return
}
c.HTML(403, "msg.html", gin.H{"msg": "Your account was created, you can login now"})
}
func (w Web) GetLoginPage(c *gin.Context) {
c.HTML(http.StatusOK, "login.html", nil)
}
func (w Web) PostLoginPage(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
_, err := w.ma.UserLogin(username, password)
if err != nil {
c.HTML(http.StatusOK, "login.html", gin.H{"msg": errors.Unwrap(err).Error()})
return
}
c.SetSameSite(http.SameSiteStrictMode)
c.HTML(http.StatusOK, "msg.html", gin.H{"msg": "Login ok!"})
}
func (w Web) DashboardPage(c *gin.Context) {
}
type UserClaim struct {
User userstore.User
jwt.RegisteredClaims
}
func (w Web) createToken(user userstore.User) (string, error) {
tokenLifespan := 15 * time.Minute
claims := UserClaim{
User: user,
RegisteredClaims: jwt.RegisteredClaims{
Subject: "user-" + user.Username,
Issuer: "gin-jwt",
ExpiresAt: jwt.NewNumericDate(time.Now().Add(tokenLifespan)),
IssuedAt: jwt.NewNumericDate(time.Now()),
},
}
t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return t.SignedString(w.config.JWT_SECRET_KEY)
}