All checks were successful
gitea-deepak/gogmagog/pipeline/head This commit looks good
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package tokens
|
|
|
|
import (
|
|
"fmt"
|
|
"gitea.deepak.science/deepak/gogmagog/models"
|
|
"github.com/go-chi/jwtauth"
|
|
"github.com/lestrrat-go/jwx/jwt"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// Toker represents a tokenizer, capable of encoding and verifying tokens.
|
|
type Toker interface {
|
|
EncodeUser(user *models.UserNoPassword) string
|
|
DecodeTokenString(tokenString string) (int64, error)
|
|
Authenticator(http.Handler) http.Handler
|
|
}
|
|
|
|
type jwtToker struct {
|
|
tokenAuth *jwtauth.JWTAuth
|
|
}
|
|
|
|
// New returns a default Toker for a given secret key.
|
|
func New(key string) Toker {
|
|
return &jwtToker{tokenAuth: jwtauth.New("HS256", []byte(key), nil)}
|
|
}
|
|
|
|
func (tok *jwtToker) EncodeUser(user *models.UserNoPassword) string {
|
|
claims := map[string]interface{}{
|
|
"user_id": user.UserID,
|
|
"username": user.Username,
|
|
"display_name": user.DisplayName,
|
|
"iss": "gogmagog.deepak.science",
|
|
"aud": "gogmagog.deepak.science",
|
|
}
|
|
jwtauth.SetIssuedNow(claims)
|
|
jwtauth.SetExpiryIn(claims, 2*time.Hour)
|
|
_, tokenString, _ := tok.tokenAuth.Encode(claims)
|
|
return tokenString
|
|
}
|
|
|
|
func (tok *jwtToker) DecodeTokenString(tokenString string) (int64, error) {
|
|
token, err := tok.tokenAuth.Decode(tokenString)
|
|
if err != nil {
|
|
return -1, fmt.Errorf("Error decoding token")
|
|
}
|
|
|
|
if token == nil {
|
|
return -1, fmt.Errorf("Token was nil")
|
|
}
|
|
|
|
err = jwt.Validate(
|
|
token,
|
|
jwt.WithIssuer("gogmagog.deepak.science"),
|
|
jwt.WithAudience("gogmagog.deepak.science"),
|
|
)
|
|
if err != nil {
|
|
return -1, err
|
|
}
|
|
|
|
userIDRaw, ok := token.Get("user_id")
|
|
if !ok {
|
|
return -1, fmt.Errorf("error finding user_id claim")
|
|
}
|
|
userID, ok := userIDRaw.(float64)
|
|
if !ok {
|
|
return -1, fmt.Errorf("Could not parse [%s] as userID", userIDRaw)
|
|
}
|
|
return int64(userID), nil
|
|
}
|