From 03db83c16256142a8c7dd0cf330052399fa134c0 Mon Sep 17 00:00:00 2001
From: "CTFang@WireLab" <ctfang.cs12@nycu.edu.tw>
Date: Fri, 28 Jun 2024 04:46:27 +0000
Subject: [PATCH] fix: missing token in header

---
 backend/WebUI/api_charging.go    | 11 +++++++++--
 backend/WebUI/api_verify.go      |  6 ++++++
 backend/WebUI/api_webui.go       |  7 +++++++
 backend/webui_context/context.go | 19 +++++++++++++++++++
 4 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/backend/WebUI/api_charging.go b/backend/WebUI/api_charging.go
index ef91287..4fca18d 100644
--- a/backend/WebUI/api_charging.go
+++ b/backend/WebUI/api_charging.go
@@ -131,13 +131,20 @@ func GetChargingRecord(c *gin.Context) {
 			return
 		}
 
-		res, err := http.NewRequestWithContext(ctx, http.MethodGet, requestUri, nil)
+		req, err := http.NewRequestWithContext(ctx, http.MethodGet, requestUri, nil)
 		if err != nil {
 			logger.ProcLog.Error(err)
 			c.JSON(http.StatusInternalServerError, gin.H{})
 			return
 		}
-		resp, res_err := httpsClient.Do(res)
+
+		if err = webui_context.GetSelf().RequestBindToken(req, ctx); err != nil {
+			logger.ProcLog.Error(err)
+			c.JSON(http.StatusInternalServerError, gin.H{})
+			return
+		}
+
+		resp, res_err := httpsClient.Do(req)
 		if res_err != nil {
 			logger.ProcLog.Error(err)
 			c.JSON(http.StatusInternalServerError, gin.H{})
diff --git a/backend/WebUI/api_verify.go b/backend/WebUI/api_verify.go
index face038..a1ced14 100644
--- a/backend/WebUI/api_verify.go
+++ b/backend/WebUI/api_verify.go
@@ -47,6 +47,12 @@ func GetSmfUserPlaneInfo() (interface{}, error) {
 			logger.ProcLog.Error(err_req)
 			return jsonData, err_req
 		}
+
+		if err = webui_context.GetSelf().RequestBindToken(req, ctx); err != nil {
+			logger.ProcLog.Error(err)
+			return jsonData, err
+		}
+
 		resp, err_rsp := httpsClient.Do(req)
 		if err_rsp != nil {
 			logger.ProcLog.Error(err_rsp)
diff --git a/backend/WebUI/api_webui.go b/backend/WebUI/api_webui.go
index 77c61c7..ae7185b 100644
--- a/backend/WebUI/api_webui.go
+++ b/backend/WebUI/api_webui.go
@@ -1800,6 +1800,13 @@ func GetRegisteredUEContext(c *gin.Context) {
 			c.JSON(http.StatusInternalServerError, gin.H{})
 			return
 		}
+
+		if err = webui_context.GetSelf().RequestBindToken(req, ctx); err != nil {
+			logger.ProcLog.Error(err)
+			c.JSON(http.StatusInternalServerError, gin.H{})
+			return
+		}
+
 		resp, err := httpsClient.Do(req)
 		if err != nil {
 			logger.ProcLog.Error(err)
diff --git a/backend/webui_context/context.go b/backend/webui_context/context.go
index 6f938b3..9157a5e 100644
--- a/backend/webui_context/context.go
+++ b/backend/webui_context/context.go
@@ -3,9 +3,12 @@ package webui_context
 import (
 	"context"
 	"fmt"
+	"net/http"
 
 	"github.com/google/uuid"
+	"golang.org/x/oauth2"
 
+	"github.com/free5gc/openapi"
 	"github.com/free5gc/openapi/Nnrf_NFDiscovery"
 	"github.com/free5gc/openapi/Nnrf_NFManagement"
 	"github.com/free5gc/openapi/models"
@@ -164,3 +167,19 @@ func (c *WEBUIContext) GetTokenCtx(serviceName models.ServiceName, targetNF mode
 	return oauth.GetTokenCtx(models.NfType_AF, targetNF,
 		c.NfInstanceID, c.NrfUri, string(serviceName))
 }
+
+// NewRequestWithContext() will not apply header in ctx
+// so httpsClient.Do(req) will not have token in header if OAuth2 enable
+func (c *WEBUIContext) RequestBindToken(req *http.Request, ctx context.Context) error {
+	if tok, ok := ctx.Value(openapi.ContextOAuth2).(oauth2.TokenSource); ok {
+		// We were able to grab an oauth2 token from the context
+		var latestToken *oauth2.Token
+		var err error
+		if latestToken, err = tok.Token(); err != nil {
+			logger.ConsumerLog.Error(err)
+			return err
+		}
+		latestToken.SetAuthHeader(req)
+	}
+	return nil
+}
-- 
GitLab