8 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
10 "github.com/dgrijalva/jwt-go"
11 "github.com/gin-gonic/gin"
17 type JwtClaims struct {
18 Authorized bool `json:"authorized"`
19 Subject int64 `json:"sub,omitempty"`
23 func SetJwtSecretKey(secret string) {
24 JWT_SECRET = []byte(secret)
27 func VerifyJwtToken(token string) (JwtClaims, error) {
28 if len(JWT_SECRET) == 0 {
29 return JwtClaims{}, fmt.Errorf("not initialized jwt secret")
32 t, err := jwt.ParseWithClaims(token, &JwtClaims{}, func(t *jwt.Token) (interface{}, error) {
33 if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
34 return nil, fmt.Errorf("Unexpected signing method: %v", t.Header["alg"])
37 return JWT_SECRET, nil
40 claims, ok := t.Claims.(*JwtClaims)
42 if !ok || !t.Valid || err != nil {
43 return JwtClaims{}, fmt.Errorf("invalid token (err: %v, claimsok: %v)", err, ok)
49 func SignJwt(claims JwtClaims) (string, error) {
50 if len(JWT_SECRET) == 0 {
51 return "", fmt.Errorf("not initialized jwt secret")
54 token := jwt.NewWithClaims(jwt.SigningMethodHS256, &claims)
56 return token.SignedString(JWT_SECRET)
59 func CreateJwtToken(userId int64) (string, error) {
64 ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
68 return SignJwt(claims)
71 func GetBearerToken(header string) (string, error) {
72 const prefix = "Bearer "
74 if !strings.HasPrefix(header, prefix) {
75 return "", fmt.Errorf("invalid authorization token")
78 return header[len(prefix):], nil
81 func JwtAuth(c *gin.Context) *Error {
82 token, err := GetBearerToken(c.GetHeader("Authorization"))
84 return &Error{NotAuthorized, "not authorized", err}
87 claims, err := VerifyJwtToken(token)
89 return &Error{NotAuthorized, "not authorized", err}
92 user, err := db.GetUserById(claims.Subject)
94 return &Error{NotAuthorized, "not authorized", err}
98 c.Set("claims", claims)
103 func GetClaims(c *gin.Context) JwtClaims {
104 claims, _ := c.Get("claims")
106 return claims.(JwtClaims)