jwtmdl.go 5.48 KiB
Newer Older
Roshan Patil's avatar
Roshan Patil committed
package jwtmdl

import (
Roshan Patil's avatar
Roshan Patil committed

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/authmdl/sessionmdl"

Roshan Patil's avatar
Roshan Patil committed
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/loggermdl"
	jwt "github.com/dgrijalva/jwt-go"
Roshan Patil's avatar
Roshan Patil committed
	"github.com/tidwall/gjson"
Roshan Patil's avatar
Roshan Patil committed
)

// GlobalJWTKey - key to decode and encode token
var GlobalJWTKey string

Roshan Patil's avatar
Roshan Patil committed
// // DecodeTokenWithJWTKey decode token
// func DecodeTokenWithJWTKey(req *http.Request, jwtKey string) (jwt.MapClaims, error) {
// 	token, err := request.ParseFromRequest(req, request.OAuth2Extractor, func(token *jwt.Token) (interface{}, error) {
// 		b := ([]byte(jwtKey))
// 		return b, nil
// 	})
// 	if errormdl.CheckErr(err) != nil {
// 		loggermdl.LogError("Error while parsing JWT Token: ", errormdl.CheckErr(err))
// 		return nil, errormdl.CheckErr(err)
// 	}
Roshan Patil's avatar
Roshan Patil committed
// 	claims, ok := token.Claims.(jwt.MapClaims)
// 	if !errormdl.CheckBool1(ok) {
// 		loggermdl.LogError("Error while parsing claims to MapClaims")
// 		return nil, errormdl.Wrap("Error while getting claims")
// 	}
Roshan Patil's avatar
Roshan Patil committed
// 	return claims, nil
// }
Roshan Patil's avatar
Roshan Patil committed
// // DecodeToken decode token
// func DecodeToken(req *http.Request) (jwt.MapClaims, error) {
// 	token, err := request.ParseFromRequest(req, request.OAuth2Extractor, func(token *jwt.Token) (interface{}, error) {
// 		b := ([]byte(GlobalJWTKey))
// 		return b, nil
// 	})
// 	if errormdl.CheckErr(err) != nil {
// 		loggermdl.LogError("Error while parsing JWT Token: ", errormdl.CheckErr(err))
// 		return nil, errormdl.CheckErr(err)
// 	}
// 	claims, ok := token.Claims.(jwt.MapClaims)
// 	if !errormdl.CheckBool1(ok) {
// 		loggermdl.LogError("Error while parsing claims to MapClaims")
// 		return nil, errormdl.Wrap("Error while getting claims")
// 	}
// 	return claims, nil
// }

type jwtCustomClaim struct {
Roshan Patil's avatar
Roshan Patil committed
	UserID    string   `json:"userId"`
	SessionId string   `json:"sessionId,omitempty"`
Roshan Patil's avatar
Roshan Patil committed
	Groups    []string `json:"groups"`
	ClientIP  string   `json:"clientIP"`
	HitsCount int      `json:"hitsCount"`
	Token     string   `json:"token"`
	Metadata  string   `json:"metadata"`
func generate(claims jwtCustomClaim, key string) (string, error) {
	return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(key))
}

func GenerateTokenWithOptions(args ...Option) (string, error) {
	options := new(Options)

	options.Key = GlobalJWTKey

	for i := range args {
		args[i](options)
	}

	claims := jwtCustomClaim{
		ClientIP:  options.ClientIP,
		Groups:    options.Groups,
		Metadata:  options.Metadata,
		SessionId: options.Session.SessionId,
		UserID:    options.UserID,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: options.ExpiresAt,
		},
	}

	t, err := generate(claims, options.Key)
	if err != nil {
		return "", err
	}

	if len(options.Session.SessionId) > 0 {
		sessionmdl.Set(options.UserID, options.Session)
	}

	return t, nil
}

// GenerateToken generates JWT token from Login object
Roshan Patil's avatar
Roshan Patil committed
func GenerateToken(loginID string, groups []string, clientIP string, metadata gjson.Result, expirationTime time.Duration) (string, error) {
	// claims := jwtCustomClaim{
	// 	UserID:   loginID,
	// 	Groups:   groups,
	// 	ClientIP: clientIP,
	// 	Metadata: metadata.String(),
	// 	StandardClaims: jwt.StandardClaims{
	// 		ExpiresAt: time.Now().Add(expirationTime).Unix(),
	// 	},
	// }
	// // Create token with claims
	// token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// // Generate encoded token and send it as response.
	// t, err := token.SignedString([]byte(GlobalJWTKey))
	// if errormdl.CheckErr(err) != nil {
	// 	loggermdl.LogError(err)
	// 	return t, errormdl.CheckErr(err)
	// }
	return GenerateTokenWithJWTKey(loginID, groups, clientIP, metadata, expirationTime, GlobalJWTKey)

// GenerateTokenWithJWTKey generates JWT token from Login object
Roshan Patil's avatar
Roshan Patil committed
func GenerateTokenWithJWTKey(loginID string, groups []string, clientIP string, metadata gjson.Result, expirationTime time.Duration, JWTKey string) (string, error) {
	claims := jwtCustomClaim{
Roshan Patil's avatar
Roshan Patil committed
		UserID:   loginID,
		Groups:   groups,
		ClientIP: clientIP,
		Metadata: metadata.String(),
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(expirationTime).Unix(),
		},
	}
	// // Create token with claims
	// token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// // Generate encoded token and send it as response.
	// t, err := token.SignedString([]byte(JWTKey))
	// if errormdl.CheckErr(err) != nil {
	// 	loggermdl.LogError(err)
	// 	return t, errormdl.CheckErr(err)
	// }
	return generate(claims, JWTKey)

//GeneratePricipleObjUsingToken GeneratePricipleObjUsingToken
func GeneratePricipleObjUsingToken(tokenReq string, jwtKey string) (jwt.MapClaims, error) {
	tokenArray := strings.Split(tokenReq, "Bearer")
	if len(tokenArray) <= 1 {
		return nil, errormdl.Wrap("Provided JWT token is nil or invalid ")
	}
	tokenFromRequest := strings.Trim(tokenArray[1], " ")
	// get data i.e.Claims from token
	token, err := jwt.Parse(tokenFromRequest, func(token *jwt.Token) (interface{}, error) {
		// Don't forget to validate the alg is what you expect:
		_, ok := token.Method.(*jwt.SigningMethodHMAC)
		if !ok {
			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(jwtKey), nil
	})

	if err != nil {
		loggermdl.LogError("Error while parsing JWT Token: ", err)
		return nil, err
	}

	claims, ok := token.Claims.(jwt.MapClaims)
	if !errormdl.CheckBool1(ok) {
		loggermdl.LogError("Error while parsing claims to MapClaims")
		return nil, errormdl.Wrap("Error while getting claims")
	}
	return claims, nil
}