heruvym/jwt_adapter/jwt_adapter.go

95 lines
1.7 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"
"github.com/skeris/identity/cookie"
2021-04-11 09:48:15 +00:00
)
2023-01-06 09:09:22 +00:00
const (
DefaultAccessSecret = "awesomeAC"
DefaultHeaderKey = "Authorization"
)
2021-04-11 09:48:15 +00:00
2023-01-06 09:09:22 +00:00
var (
_ cookie.Cookie = new(JwtAdapter)
accessSecret = DefaultAccessSecret
)
2021-04-11 09:48:15 +00:00
type JwtAdapter struct {
jwt.StandardClaims
}
2023-01-06 09:09:22 +00:00
func init() {
aS := os.Getenv("JWT_SECRET")
2021-04-11 09:48:15 +00:00
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) {
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
2021-04-11 09:48:15 +00:00
return []byte(accessSecret), nil
})
if err != nil {
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 {
return nil, err
}
return claims, nil
2021-04-11 09:48:15 +00:00
}
func Timestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}