tsk-19: Service login (#23)

Closes #19

Reviewed-on: phoenix/textsender-auth#23
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
This commit is contained in:
phoenix
2025-11-21 18:42:58 +00:00
committed by phoenix
parent c340693b24
commit 0a00282ba7
9 changed files with 205 additions and 29 deletions
+2 -2
View File
@@ -8,12 +8,12 @@ type HashMash struct {
Password string
}
func (h HashMash) HashPassword() (string, error) {
func (h *HashMash) HashPassword() (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(h.Password), bcrypt.DefaultCost)
return string(bytes), err
}
func (h HashMash) CheckPasswordHash(password string, hash string) bool {
func (h *HashMash) CheckPasswordHash(password string, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
+46 -13
View File
@@ -1,8 +1,10 @@
package utility
import (
"fmt"
"time"
"github.com/google/uuid"
"github.com/golang-jwt/jwt/v5"
"git.kundeng.us/phoenix/textsender-auth/internal/config"
@@ -15,33 +17,64 @@ const TOKEN_TYPE = "Bearer"
type TokenGenerator struct {
SecretKey []byte
hourOffset time.Duration
}
func (t *TokenGenerator) SetSecretKey(secretKey string) {
t.SecretKey = []byte(secretKey)
}
func (t *TokenGenerator) GenerateToken(user user.User) (*token.Login, error) {
issuedAt := time.Now()
expirationTime := time.Now().Add(4 * time.Hour)
claims := t.generateClaims(user, TOKEN_TYPE, issuedAt, expirationTime)
myToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
if tokenString, err := myToken.SignedString(t.SecretKey); err != nil {
return nil, err
func (t *TokenGenerator) SetHourOffset(offset time.Duration) error {
if offset < 48 {
t.hourOffset = offset
return nil
} else {
return &token.Login{AccessToken: tokenString, TokenType: TOKEN_TYPE, ExpiresIn: expirationTime.Unix()}, nil
return fmt.Errorf("No change")
}
}
func (t *TokenGenerator) generateClaims(user user.User, role string, issuedAt time.Time, expiredAt time.Time) token.Claims {
return token.Claims{
UserId: user.Id,
func (t *TokenGenerator) GenerateToken(usr any) (*token.Login, error) {
issuedAt := time.Now()
if t.hourOffset == 0 {
t.hourOffset = 4
}
expirationTime := time.Now().Add(t.hourOffset * time.Hour)
if claims, err := t.generateClaims(usr, TOKEN_TYPE, issuedAt, expirationTime); err != nil {
return nil, fmt.Errorf("Error generating claims: %v", err)
} else {
myToken := jwt.NewWithClaims(jwt.SigningMethodHS256, *claims)
if tokenString, err := myToken.SignedString(t.SecretKey); err != nil {
return nil, err
} else {
return &token.Login{AccessToken: tokenString, TokenType: TOKEN_TYPE, ExpiresIn: expirationTime.Unix()}, nil
}
}
}
func (t *TokenGenerator) generateClaims(usr any, role string, issuedAt time.Time, expiredAt time.Time) (*token.Claims, error) {
var id uuid.UUID
switch val := usr.(type) {
case user.User:
id = val.Id
case *user.User:
id = val.Id
case user.ServiceUser:
id = val.Id
case *user.ServiceUser:
id = val.Id
default:
return nil, fmt.Errorf("Invalid type")
}
return &token.Claims{
UserId: id,
Role: role,
RegisteredClaims: jwt.RegisteredClaims{
Issuer: config.App_Name,
ExpiresAt: jwt.NewNumericDate(expiredAt),
IssuedAt: jwt.NewNumericDate(issuedAt),
},
}
}, nil
}