ente/server/pkg/controller/user/jwt.go
2024-03-01 13:37:01 +05:30

50 lines
1.6 KiB
Go

package user
import (
"fmt"
enteJWT "github.com/ente-io/museum/ente/jwt"
"github.com/ente-io/museum/pkg/utils/time"
"github.com/ente-io/stacktrace"
"github.com/golang-jwt/jwt"
)
// jwt token validity = 1 day
const ValidForDays = 1
func (c *UserController) GetJWTToken(userID int64, scope enteJWT.ClaimScope) (string, error) {
// Create a new token object, specifying signing method and the claims
// you would like it to contain.
token := jwt.NewWithClaims(jwt.SigningMethodHS256, &enteJWT.WebCommonJWTClaim{
UserID: userID,
ExpiryTime: time.NDaysFromNow(1),
ClaimScope: &scope,
})
// Sign and get the complete encoded token as a string using the secret
tokenString, err := token.SignedString(c.JwtSecret)
if err != nil {
return "", stacktrace.Propagate(err, "")
}
return tokenString, nil
}
func (c *UserController) ValidateJWTToken(jwtToken string, scope enteJWT.ClaimScope) (int64, error) {
token, err := jwt.ParseWithClaims(jwtToken, &enteJWT.WebCommonJWTClaim{}, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, stacktrace.Propagate(fmt.Errorf("unexpected signing method: %v", token.Header["alg"]), "")
}
return c.JwtSecret, nil
})
if err != nil {
return -1, stacktrace.Propagate(err, "JWT parsed failed")
}
claims, ok := token.Claims.(*enteJWT.WebCommonJWTClaim)
if ok && token.Valid {
if claims.GetScope() != scope {
return -1, stacktrace.Propagate(fmt.Errorf("recived claimScope %s is different than expected scope: %s", claims.GetScope(), scope), "")
}
return claims.UserID, nil
}
return -1, stacktrace.Propagate(err, "JWT claim failed")
}