heruvym/internal/utils/jwt_adapter/jwt_adapter.go

108 lines
1.9 KiB
Go
Raw Normal View History

2021-04-11 09:48:15 +00:00
package jwt_adapter
import (
"context"
"fmt"
"os"
"time"
2023-01-06 09:09:22 +00:00
"github.com/dgrijalva/jwt-go"
2021-04-11 09:48:15 +00:00
)
2023-01-06 09:09:22 +00:00
const (
DefaultAccessSecret = "awesomeAC"
DefaultHeaderKey = "Authorization"
2023-03-01 17:38:03 +00:00
RoleKey = "role"
2023-01-06 09:09:22 +00:00
)
2021-04-11 09:48:15 +00:00
2023-01-06 09:09:22 +00:00
var (
2023-03-01 17:38:03 +00:00
accessSecret = DefaultAccessSecret
2023-01-06 09:09:22 +00:00
)
2021-04-11 09:48:15 +00:00
type JwtAdapter struct {
jwt.StandardClaims
2023-03-10 13:00:35 +00:00
Id string `json:"id"`
2021-04-11 09:48:15 +00:00
}
2023-01-06 09:09:22 +00:00
func init() {
aS := os.Getenv("JWT_SECRET")
2021-04-11 09:48:15 +00:00
2024-12-01 22:10:20 +00:00
fmt.Println("JWT_SECRET", aS)
2023-01-06 09:09:22 +00:00
if len(aS) != 0 {
accessSecret = aS
}
2021-04-11 09:48:15 +00:00
}
func Get(ctx context.Context) *JwtAdapter {
if adapter, ok := ctx.Value(DefaultHeaderKey).(*JwtAdapter); ok {
return adapter
}
return nil
}
2023-01-06 09:09:22 +00:00
func (receiver *JwtAdapter) SetUserID(ID string) {
receiver.Id = ID
2021-04-11 09:48:15 +00:00
}
2023-01-06 09:09:22 +00:00
func (receiver *JwtAdapter) GetUserID() string {
return receiver.Id
2021-04-11 09:48:15 +00:00
}
2023-01-06 09:09:22 +00:00
func (receiver *JwtAdapter) Validate() error {
if err := receiver.Valid(); err != nil {
return err
}
2021-04-11 09:48:15 +00:00
2023-01-06 09:09:22 +00:00
if !receiver.VerifyIssuer("pena-auth-service", true) {
return fmt.Errorf("invalid issuer")
}
2021-04-11 09:48:15 +00:00
2023-01-06 09:09:22 +00:00
if !receiver.VerifyAudience("pena", true) {
return fmt.Errorf("invalid audience")
}
2021-04-11 09:48:15 +00:00
2023-01-06 09:09:22 +00:00
return nil
2021-04-11 09:48:15 +00:00
}
func Decode(tokenString string) (*JwtAdapter, error) {
2024-12-01 22:10:20 +00:00
fmt.Println("JWT_SECRET2", tokenString, accessSecret)
2023-01-06 09:09:22 +00:00
token, err := jwt.ParseWithClaims(tokenString, &JwtAdapter{}, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
2021-04-11 09:48:15 +00:00
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
2023-01-06 09:09:22 +00:00
2023-03-09 12:47:57 +00:00
return jwt.ParseRSAPublicKeyFromPEM([]byte(accessSecret))
2021-04-11 09:48:15 +00:00
})
if err != nil {
2023-03-09 09:43:50 +00:00
fmt.Println("parserr", err)
2021-04-11 09:48:15 +00:00
return nil, err
}
2023-01-06 09:09:22 +00:00
claims, ok := token.Claims.(*JwtAdapter)
if !ok && !token.Valid {
2021-04-11 09:48:15 +00:00
return nil, fmt.Errorf("ErrorNoValidClaims")
}
2023-01-06 09:09:22 +00:00
if err := claims.Validate(); err != nil {
2023-03-09 09:43:50 +00:00
fmt.Println("validerr", err)
2023-01-06 09:09:22 +00:00
return nil, err
}
2023-03-01 17:38:03 +00:00
2023-01-06 09:09:22 +00:00
return claims, nil
2021-04-11 09:48:15 +00:00
}
2023-03-01 17:38:03 +00:00
func GetRole(ctx context.Context) string {
role := ctx.Value(RoleKey)
if role == nil {
return ""
}
return role.(string)
}
2021-04-11 09:48:15 +00:00
func Timestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}