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

import (
	"net/http"
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"
	"github.com/dgrijalva/jwt-go/request"
)

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

// DecodeTokenWithJWTKey decode token
func DecodeTokenWithJWTKey(req *http.Request, jwtKey string) (jwt.MapClaims, error) {
Roshan Patil's avatar
Roshan Patil committed
	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)
	}

	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
}

// 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)
	}
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")
	}
	return claims, nil
}

type jwtCustomClaim struct {
	UserID string      `json:"userId"`
	Groups interface{} `json:"groups,omitempty"`
	jwt.StandardClaims
}

// GenerateToken generates JWT token from Login object
func GenerateToken(loginID string, groups interface{}, expirationTime time.Duration) (string, error) {
	claims := jwtCustomClaim{
		loginID,
		groups,
		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 t, nil
}

// GenerateTokenWithJWTKey generates JWT token from Login object
func GenerateTokenWithJWTKey(loginID string, groups interface{}, expirationTime time.Duration, JWTKey string) (string, error) {
	claims := jwtCustomClaim{
		loginID,
		groups,
		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 t, nil
}