Building and returning JWTs on login

* Created Util package for assorted items
* Currently generates an HMAC key on startup, to be changed
* JWT also includes login role
This commit is contained in:
🐙PiperYxzzy
2022-04-30 16:30:07 +02:00
parent d1c31e0fd4
commit 6db02148ea
3 changed files with 57 additions and 2 deletions

View File

@@ -2,8 +2,11 @@ package models
import ( import (
"errors" "errors"
"time"
"github.com/golang-jwt/jwt"
"github.com/yxzzy-wtf/gin-gonic-prepack/database" "github.com/yxzzy-wtf/gin-gonic-prepack/database"
"github.com/yxzzy-wtf/gin-gonic-prepack/util"
) )
type Admin struct { type Admin struct {
@@ -11,8 +14,26 @@ type Admin struct {
Email string Email string
} }
const adminJwtDuration = time.Hour * 2
var adminHmac = util.GenerateHmac()
func (a *Admin) GetJwt() (string, int) { func (a *Admin) GetJwt() (string, int) {
return "", 0 exp := time.Now().Add(adminJwtDuration)
j := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": a.Uid.String(),
"iat": time.Now(),
"exp": exp,
"role": "admin",
})
jstr, err := j.SignedString(adminHmac)
if err != nil {
// we should ALWAYS be able to build and sign a str
panic(err)
}
return jstr, int(adminJwtDuration.Seconds())
} }
func (a *Admin) ByEmail(email string) error { func (a *Admin) ByEmail(email string) error {

View File

@@ -2,8 +2,11 @@ package models
import ( import (
"errors" "errors"
"time"
"github.com/golang-jwt/jwt"
"github.com/yxzzy-wtf/gin-gonic-prepack/database" "github.com/yxzzy-wtf/gin-gonic-prepack/database"
"github.com/yxzzy-wtf/gin-gonic-prepack/util"
) )
type User struct { type User struct {
@@ -11,8 +14,27 @@ type User struct {
Email string `gorm:"unique"` Email string `gorm:"unique"`
} }
const userJwtDuration = time.Hour * 24
var userHmac = util.GenerateHmac()
func (u *User) GetJwt() (string, int) { func (u *User) GetJwt() (string, int) {
return "", 0 exp := time.Now().Add(userJwtDuration)
j := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": u.Uid.String(),
"iat": time.Now(),
"exp": exp,
"role": "user",
"tid": u.Tenant.String(),
})
jstr, err := j.SignedString(userHmac)
if err != nil {
// we should ALWAYS be able to build and sign a str
panic(err)
}
return jstr, int(userJwtDuration.Seconds())
} }
func (u *User) ByEmail(email string) error { func (u *User) ByEmail(email string) error {

12
util/util.go Normal file
View File

@@ -0,0 +1,12 @@
package util
import "crypto/rand"
func GenerateHmac() []byte {
b := make([]byte, 64)
if _, err := rand.Read(b); err != nil {
panic(err)
}
return b
}