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:
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user