Select Git revision
jwt.go 2.66 KiB
package auth
import (
"encoding/json"
"github.com/golang-jwt/jwt/v4"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/date_utils"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
"net/http"
"time"
)
type JsonWebToken struct {
UserID string `json:"user_id"`
Password string `json:"password"`
ProviderID int64 `json:"provider_id,omitempty"`
ExpiryDate time.Time `json:"expiry_date"`
}
// GenerateJWT takes the payload and generates a signed JWT using the provided secret
func GenerateJWT(payload JsonWebToken, secret []byte) (string, error) {
// Convert the JsonWebToken to a map[string]interface{}
tokenBytes, err := json.Marshal(payload)
if err != nil {
return "", err
}
tokenMap := make(map[string]interface{})
err = json.Unmarshal(tokenBytes, &tokenMap)
if err != nil {
return "", err
}
// Create the signed token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims(tokenMap))
tokenString, err := token.SignedString(secret)
if err != nil {
return "", err
}
return tokenString, nil
}
// ValidateJWT parses the JWT and validates that it is signed correctly
func ValidateJWT(tokenString string, secret []byte) (JsonWebToken, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// Validate the signing method
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, errors.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return secret, nil
})
if err != nil {
return JsonWebToken{}, err
}
if token == nil {
return JsonWebToken{}, errors.Error("could not get token from token string")
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok || !token.Valid {
return JsonWebToken{}, errors.Error("invalid token")
}
// Convert the MapClaims to a JsonWebToken
claimsBytes, err := json.Marshal(claims)
if err != nil {
return JsonWebToken{}, err
}