52 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package jwt
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"twitch-clone/pkg/models"
 | 
						|
 | 
						|
	jwt "github.com/golang-jwt/jwt"
 | 
						|
)
 | 
						|
 | 
						|
func GenerateJWT(user models.Claim) (string, error) {
 | 
						|
	payload := jwt.MapClaims{
 | 
						|
		"id":  user.ID,
 | 
						|
		"exp": time.Now().Add(time.Hour * 1500).Unix(),
 | 
						|
	}
 | 
						|
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)
 | 
						|
	tokenStr, err := token.SignedString([]byte(SecretKey))
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		return tokenStr, err
 | 
						|
	}
 | 
						|
	return tokenStr, nil
 | 
						|
}
 | 
						|
 | 
						|
func ProcessJWT(token string) (*models.Claim, bool, int64, error) {
 | 
						|
	claims := &models.Claim{}
 | 
						|
 | 
						|
	splitToken := strings.Split(token, "Bearer")
 | 
						|
 | 
						|
	if len(splitToken) != 2 {
 | 
						|
		return claims, false, 0, errors.New("invalid JWT format")
 | 
						|
	}
 | 
						|
 | 
						|
	token = strings.TrimSpace(splitToken[1])
 | 
						|
	tkn, err := jwt.ParseWithClaims(token, claims, func(tk *jwt.Token) (interface{}, error) {
 | 
						|
		return []byte(SecretKey), nil
 | 
						|
	})
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		return claims, false, 0, err
 | 
						|
	}
 | 
						|
 | 
						|
	if !tkn.Valid {
 | 
						|
		return claims, false, 0, errors.New("invalid JWT token")
 | 
						|
	}
 | 
						|
 | 
						|
	// TODO: validate whether user exists
 | 
						|
	return claims, true, claims.ID, nil
 | 
						|
}
 |