bodytrack/api/internal/services/auth.go

56 lines
1.3 KiB
Go

package services
import (
"encoding/base64"
"errors"
"net/http"
"github.com/go-chi/jwtauth/v5"
"golang.org/x/crypto/bcrypt"
)
var tokenEncoder *jwtauth.JWTAuth
var JWTVerifier func(http.Handler) http.Handler
func GenerateHashFromPassword(plainTextPass string) (string, error) {
hashedPasswordBytes, err := bcrypt.GenerateFromPassword([]byte(plainTextPass), bcrypt.MinCost)
if err != nil {
return "", err
}
// Convert the hashed password to a base64 encoded string
return base64.URLEncoding.EncodeToString(hashedPasswordBytes), nil
}
func PasswordEqual(hashedPassword, plainTextPass string) bool {
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(plainTextPass)) != nil
}
func InitJWT(secretTxt string) {
tokenEncoder = jwtauth.New("HS256", []byte(secretTxt), nil)
}
func NewJWTVerifier() func(http.Handler) http.Handler {
return jwtauth.Verifier(tokenEncoder)
}
func GenerateJWT(u User) string {
_, tokenString, _ := tokenEncoder.Encode(map[string]interface{}{
"id": u.ID,
"x-Hasura-Role": "user",
"x-Hasura-User-Id": u.ID,
})
return tokenString
}
func GetUserIDFromClaims(req *http.Request) (int64, error) {
_, claims, _ := jwtauth.FromContext(req.Context())
userIdStr, ok := claims["id"]
if !ok {
return -1, errors.New("claim by name 'id' not found")
}
return int64(userIdStr.(float64)), nil
}