github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/dashboard/api/pkg/server/utils.go (about)

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding/json"
     7  	"fmt"
     8  	"io"
     9  	"log"
    10  	"net/http"
    11  	"strings"
    12  
    13  	"github.com/filecoin-project/bacalhau/dashboard/api/pkg/model"
    14  	"github.com/filecoin-project/bacalhau/dashboard/api/pkg/types"
    15  	"github.com/golang-jwt/jwt"
    16  )
    17  
    18  func GetRequestBody[T any](w http.ResponseWriter, r *http.Request) (*T, error) {
    19  	var requestBody T
    20  
    21  	var buf bytes.Buffer
    22  	_, err := io.Copy(&buf, r.Body)
    23  	if err != nil {
    24  		log.Print(err)
    25  		http.Error(w, err.Error(), http.StatusInternalServerError)
    26  		return nil, err
    27  	}
    28  	err = json.Unmarshal(buf.Bytes(), &requestBody)
    29  	if err != nil {
    30  		log.Print(err)
    31  		http.Error(w, err.Error(), http.StatusInternalServerError)
    32  		return nil, err
    33  	}
    34  	return &requestBody, nil
    35  }
    36  
    37  func generateJWT(
    38  	secret string,
    39  	username string,
    40  ) (string, error) {
    41  	token := jwt.New(jwt.SigningMethodHS256)
    42  	claims := token.Claims.(jwt.MapClaims)
    43  	//claims["exp"] = time.Now().Add(24 * time.Hour)
    44  	claims["authorized"] = true
    45  	claims["user"] = username
    46  	return token.SignedString([]byte(secret))
    47  }
    48  
    49  func parseJWT(
    50  	secret string,
    51  	tokenString string,
    52  ) (string, error) {
    53  	signingKey := []byte(secret)
    54  	parsedToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    55  		return signingKey, nil
    56  	})
    57  	if err != nil {
    58  		return "", err
    59  	}
    60  	claims, ok := parsedToken.Claims.(jwt.MapClaims)
    61  	if !ok {
    62  		return "", fmt.Errorf("could not parse claims")
    63  	}
    64  	return claims["user"].(string), nil
    65  }
    66  
    67  func getUserFromRequest(
    68  	model *model.ModelAPI,
    69  	req *http.Request,
    70  	secret string,
    71  ) (*types.User, error) {
    72  	// extract the JWT token from the bearer string
    73  	tokenString := strings.Replace(req.Header.Get("Authorization"), "Bearer ", "", 1)
    74  	if tokenString == "" {
    75  		return nil, fmt.Errorf("no token provided")
    76  	}
    77  	username, err := parseJWT(secret, tokenString)
    78  	if err != nil {
    79  		return nil, fmt.Errorf("error parsing token: %s", err.Error())
    80  	}
    81  	user, err := model.GetUser(context.Background(), username)
    82  	if err != nil {
    83  		return nil, fmt.Errorf("error parsing token: %s", err.Error())
    84  	}
    85  	user.HashedPassword = ""
    86  	return user, nil
    87  }