summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/rpserver/main.go20
-rw-r--r--go.mod5
-rw-r--r--go.sum4
-rw-r--r--internal/auth/auth.go31
-rw-r--r--internal/auth/gen.go19
-rw-r--r--internal/cmd/root.go7
6 files changed, 60 insertions, 26 deletions
diff --git a/cmd/rpserver/main.go b/cmd/rpserver/main.go
index 9d1c5a5..408fe78 100644
--- a/cmd/rpserver/main.go
+++ b/cmd/rpserver/main.go
@@ -1 +1,21 @@
package rpserver
+
+import (
+ "log"
+ "os"
+
+ "github.com/Wacky404/rpserver/internal/cmd"
+ "github.com/joho/godotenv"
+)
+
+func init() {
+ godotenv.Load()
+}
+
+func main() {
+ if os.Getenv("JWT_SECRET") == "" {
+ log.Println("a critical env var is not set!")
+ os.Exit(1)
+ }
+ cmd.ExecuteServer()
+}
diff --git a/go.mod b/go.mod
index 08ff3e5..3107b98 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,8 @@
module github.com/Wacky404/rpserver
go 1.24.0
+
+require (
+ github.com/golang-jwt/jwt/v5 v5.2.1
+ github.com/joho/godotenv v1.5.1
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..4500056
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,4 @@
+github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
+github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
+github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
+github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
diff --git a/internal/auth/auth.go b/internal/auth/auth.go
index fdf9cd7..2826a47 100644
--- a/internal/auth/auth.go
+++ b/internal/auth/auth.go
@@ -1,27 +1,44 @@
package auth
import (
+ "fmt"
"net/http"
"os"
"strings"
"github.com/golang-jwt/jwt/v5"
+ "github.com/joho/godotenv"
)
-var jwtSecret = []byte(os.Getenv("JWT_SECRET"))
+func init() {
+ godotenv.Load()
+}
+
+var (
+ jwtsecret = []byte(os.Getenv("JWT_SECRET"))
+ algo = string(os.Getenv("JWT_ALGO"))
+)
-func validateJWT(tokenString string) (bool, error) {
+func validateJWT(tokenString string, expectedAlg string) (bool, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
- return jwtSecret, nil
+ if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
+ return nil, fmt.Errorf("invalid token: %v", token.Header["alg"])
+ }
+ if token.Header["alg"] != expectedAlg {
+ return nil, fmt.Errorf("incorrect alg: %v", token.Header["alg"])
+ }
+ return jwtsecret, nil
})
if err != nil || !token.Valid {
return false, err
}
-
- return true, nil
+ if _, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
+ return true, nil
+ }
+ return false, fmt.Errorf("invalid token")
}
-func AuthRequest(r *http.Request) bool {
+func Verifyrequest(r *http.Request) bool {
authHeader := r.Header.Get("Authorization")
if authHeader == "" {
return false
@@ -34,6 +51,6 @@ func AuthRequest(r *http.Request) bool {
}
token := authSplit[1]
- isValid, _ := validateJWT(token)
+ isValid, _ := validateJWT(token, algo)
return isValid
}
diff --git a/internal/auth/gen.go b/internal/auth/gen.go
deleted file mode 100644
index dd354c8..0000000
--- a/internal/auth/gen.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package auth
-
-import (
- "fmt"
- "time"
- "os"
- "github.com/goland-jwt/jwt/v5"
-)
-
-var jwtkey = []byte(os.Getenv("JWT_KEY"))
-
-func GenerateJWT() (string, error) {
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
- "user": "testuser",
- "exp": time.Now().Add(time.Hour * 1).Unix(), // set it to expire after one hour
- })
-
- return token.SignedString(jwtSecret)
-}
diff --git a/internal/cmd/root.go b/internal/cmd/root.go
index db0c87a..af7d694 100644
--- a/internal/cmd/root.go
+++ b/internal/cmd/root.go
@@ -7,6 +7,8 @@ import (
"net/http/httputil"
"net/url"
"time"
+
+ "github.com/Wacky404/rpserver/internal/auth"
)
func ExecuteServer() {
@@ -17,6 +19,11 @@ func ExecuteServer() {
}
func handleProxy(w http.ResponseWriter, r *http.Request) {
+ if !auth.Verifyrequest(r) {
+ http.Error(w, "Unauthorized", http.StatusUnauthorized)
+ return
+ }
+
backendURL, err := getBackendURL(r)
if err != nil {
http.Error(w, "Backend URL not provided", http.StatusBadRequest)