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 }