wrapperr/modules/authorize.go
aunefyren 1a7c66c4b4 Major refactor
Basic Auth on front end
Switched to GIN for http routing
Reworked middleware
2023-10-25 15:14:02 +02:00

135 lines
3.3 KiB
Go

package modules
import (
"aunefyren/wrapperr/files"
"aunefyren/wrapperr/models"
"aunefyren/wrapperr/utilities"
"errors"
"log"
"time"
"github.com/golang-jwt/jwt/v5"
)
func ValidateToken(signedToken string, privateKey string) (err error) {
token, err := jwt.ParseWithClaims(
signedToken,
&models.Payload{},
func(token *jwt.Token) (interface{}, error) {
return []byte(privateKey), nil
},
)
if err != nil {
return
}
claims, ok := token.Claims.(*models.Payload)
if !ok {
err = errors.New("Couldn't parse claims.")
return
} else if claims.ExpiresAt == nil || claims.NotBefore == nil {
err = errors.New("Claims not present.")
return
}
now := time.Now()
if claims.ExpiresAt.Time.Before(now) {
err = errors.New("Token has expired.")
return
}
if claims.NotBefore.Time.After(now) {
err = errors.New("Token has not begun.")
return
}
return
}
func ParseToken(signedToken string, privateKey string) (*models.Payload, error) {
token, err := jwt.ParseWithClaims(
signedToken,
&models.Payload{},
func(token *jwt.Token) (interface{}, error) {
return []byte(privateKey), nil
},
)
if err != nil {
return nil, err
}
claims, ok := token.Claims.(*models.Payload)
if !ok {
err = errors.New("Couldn't parse claims")
return nil, err
} else if claims.ExpiresAt == nil || claims.NotBefore == nil {
err = errors.New("Claims not present.")
return nil, err
}
now := time.Now()
if claims.ExpiresAt.Time.Before(now) {
err = errors.New("Token has expired.")
return nil, err
}
if claims.NotBefore.Time.After(now) {
err = errors.New("Token has not begun.")
return nil, err
}
return claims, nil
}
// CreateToken creates a new JWT token used to validate a users session. Valid for three days by default.
func CreateToken(username string, admin bool, authtoken string) (string, error) {
PrivateKey, err := files.GetPrivateKey()
if err != nil {
log.Println("Failed to load JWT Token settings. Error: ")
log.Println(err)
return "", errors.New("Failed to load JWT Token settings.")
}
duration := time.Now().Add(time.Hour * 24 * 3)
token, _, err := CreateTokenTwo(PrivateKey, username, admin, authtoken, duration)
if err != nil {
log.Println("Failed to create session token. Error: ")
log.Println(err)
return "", errors.New("Failed to create session token.")
}
return token, nil
}
// CreateToken creates a new token for a specific username and duration
func CreateTokenTwo(PrivateKey string, username string, admin bool, authtoken string, duration time.Time) (token string, payload models.Payload, err error) {
token = ""
payload = models.Payload{}
err = nil
payload, err = NewPayload(username, admin, authtoken, duration)
if err != nil {
return token, payload, err
}
tokenUnsigned := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)
token, err = tokenUnsigned.SignedString([]byte(PrivateKey))
return token, payload, err
}
func ValidateBasicAuth(username string, password string) (err error) {
err = nil
adminConfig, err := files.GetAdminConfig()
if err != nil {
log.Println("Failed to load admin settings. Error: " + err.Error())
return errors.New("Failed to load admin settings.")
}
passwordValidity := utilities.ComparePasswords(adminConfig.AdminPassword, password)
if username != adminConfig.AdminUsername || !passwordValidity {
return errors.New("Non-valid credentials.")
}
return nil
}