fix: proxy reyou callbacks with chatapp3 token
This commit is contained in:
parent
dffca4dec7
commit
4024f62e53
@ -623,6 +623,54 @@ func TestHotgameCompatProxiesChatapp3TokenWithoutGameCallback(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReyouGameCallbackProxiesChatapp3TokenWithoutGameCallback(t *testing.T) {
|
||||||
|
token := chatapp3HotgameToken("v1", 99123456, "LIKEI", 4102444800000, 1700000000000)
|
||||||
|
body := `{"gameId":"20","uid":"99123456","token":"` + token + `","sign":"s"}`
|
||||||
|
var gotHost string
|
||||||
|
var gotPath string
|
||||||
|
var gotQuery string
|
||||||
|
var gotBody string
|
||||||
|
var gotContentType string
|
||||||
|
oldTransport := http.DefaultTransport
|
||||||
|
http.DefaultTransport = roundTripFunc(func(request *http.Request) (*http.Response, error) {
|
||||||
|
gotHost = request.URL.Host
|
||||||
|
gotPath = request.URL.Path
|
||||||
|
gotQuery = request.URL.RawQuery
|
||||||
|
gotContentType = request.Header.Get("Content-Type")
|
||||||
|
raw, _ := io.ReadAll(request.Body)
|
||||||
|
gotBody = string(raw)
|
||||||
|
header := http.Header{}
|
||||||
|
header.Set("Content-Type", "application/json")
|
||||||
|
return &http.Response{
|
||||||
|
StatusCode: http.StatusOK,
|
||||||
|
Header: header,
|
||||||
|
Body: io.NopCloser(bytes.NewReader([]byte(`{"errorCode":0,"data":{"coin":1000}}`))),
|
||||||
|
Request: request,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
defer func() { http.DefaultTransport = oldTransport }()
|
||||||
|
gameClient := &fakeGatewayGameClient{callbackResp: &gamev1.CallbackResponse{RawBody: []byte(`{"errorCode":0}`), ContentType: "application/json"}}
|
||||||
|
handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, &fakeUserProfileClient{})
|
||||||
|
handler.SetGameClient(gameClient)
|
||||||
|
router := handler.Routes(auth.NewVerifier("secret"))
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "/api/v1/game-callbacks/reyou/getUserInfo?nonce=1", bytes.NewReader([]byte(body)))
|
||||||
|
request.Header.Set("X-App-Code", "lalu")
|
||||||
|
request.Header.Set("Content-Type", "application/json")
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
|
||||||
|
router.ServeHTTP(recorder, request)
|
||||||
|
|
||||||
|
if recorder.Code != http.StatusOK || recorder.Body.String() != `{"errorCode":0,"data":{"coin":1000}}` {
|
||||||
|
t.Fatalf("reyou chatapp3 proxy response mismatch: status=%d body=%s", recorder.Code, recorder.Body.String())
|
||||||
|
}
|
||||||
|
if gotHost != "jvapi.haiyihy.com" || gotPath != "/go/getUserInfo" || gotQuery != "nonce=1" || gotBody != body || gotContentType != "application/json" {
|
||||||
|
t.Fatalf("reyou chatapp3 proxy request mismatch: host=%q path=%q query=%q content_type=%q body=%s", gotHost, gotPath, gotQuery, gotContentType, gotBody)
|
||||||
|
}
|
||||||
|
if gameClient.lastCallback != nil {
|
||||||
|
t.Fatalf("reyou chatapp3 token must not enter hyapp game callback: %+v", gameClient.lastCallback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func chatapp3HotgameToken(version string, userID int64, sysOrigin string, expireMs int64, releaseMs int64) string {
|
func chatapp3HotgameToken(version string, userID int64, sysOrigin string, expireMs int64, releaseMs int64) string {
|
||||||
payload := url.QueryEscape(version + ":" + strconv.FormatInt(userID, 10) + ":" + sysOrigin + ":" + strconv.FormatInt(expireMs, 10) + ":" + strconv.FormatInt(releaseMs, 10))
|
payload := url.QueryEscape(version + ":" + strconv.FormatInt(userID, 10) + ":" + sysOrigin + ":" + strconv.FormatInt(expireMs, 10) + ":" + strconv.FormatInt(releaseMs, 10))
|
||||||
return "sign." + base64.StdEncoding.EncodeToString([]byte(payload))
|
return "sign." + base64.StdEncoding.EncodeToString([]byte(payload))
|
||||||
|
|||||||
@ -750,7 +750,14 @@ func (h *Handler) handleGameCallback(writer http.ResponseWriter, request *http.R
|
|||||||
http.Error(writer, "invalid request body", http.StatusBadRequest)
|
http.Error(writer, "invalid request body", http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
h.handleGameCallbackRaw(writer, request, raw, strings.TrimSpace(request.PathValue("platform_code")), strings.TrimSpace(request.PathValue("operation")))
|
platformCode := strings.TrimSpace(request.PathValue("platform_code"))
|
||||||
|
operation := strings.TrimSpace(request.PathValue("operation"))
|
||||||
|
// reyou 的线上回调现在存在两种入口:根路径兼容入口和 /game-callbacks/reyou/* 通用入口。
|
||||||
|
// 通用入口同样先按 token 归属做分流,chatapp3 token 原样回源 chatapp3,其他 token 才交给 hyapp 自己的游戏服务。
|
||||||
|
if h.tryProxyChatapp3HotgameCallback(writer, request, raw, platformCode, operation) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
h.handleGameCallbackRaw(writer, request, raw, platformCode, operation)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) handleGameCallbackRaw(writer http.ResponseWriter, request *http.Request, raw []byte, platformCode string, operation string) {
|
func (h *Handler) handleGameCallbackRaw(writer http.ResponseWriter, request *http.Request, raw []byte, platformCode string, operation string) {
|
||||||
|
|||||||
@ -35,16 +35,23 @@ func (h *Handler) handleHotgameCompatCallback(writer http.ResponseWriter, reques
|
|||||||
http.Error(writer, "invalid request body", http.StatusBadRequest)
|
http.Error(writer, "invalid request body", http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 热游固定回调地址无法按域名区分 hyapp 和 chatapp3;这里用 token 结构做最小路由键。
|
if h.tryProxyChatapp3HotgameCallback(writer, request, raw, hotgameCompatPlatformCode, operation) {
|
||||||
// chatapp3 的用户 token 是 sign.base64(version:userId:sysOrigin:expire:release),hyapp 当前热游 token 是 JWT 或本服务 session。
|
|
||||||
if isChatapp3HotgameToken(hotgameCompatCallbackToken(raw)) {
|
|
||||||
h.proxyChatapp3HotgameCallback(writer, request, raw, operation)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 非 chatapp3 token 全部继续走 hyapp 自己的 reyou 平台配置,避免 hyapp 自有热游游戏误转到 chatapp3。
|
// 非 chatapp3 token 全部继续走 hyapp 自己的 reyou 平台配置,避免 hyapp 自有热游游戏误转到 chatapp3。
|
||||||
h.handleGameCallbackRaw(writer, request, raw, hotgameCompatPlatformCode, operation)
|
h.handleGameCallbackRaw(writer, request, raw, hotgameCompatPlatformCode, operation)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) tryProxyChatapp3HotgameCallback(writer http.ResponseWriter, request *http.Request, raw []byte, platformCode string, operation string) bool {
|
||||||
|
// 热游固定回调地址无法按域名区分 hyapp 和 chatapp3;这里用 token 结构做最小路由键。
|
||||||
|
// chatapp3 的用户 token 是 sign.base64(version:userId:sysOrigin:expire:release),hyapp 当前热游 token 是 JWT 或本服务 session。
|
||||||
|
if !strings.EqualFold(strings.TrimSpace(platformCode), hotgameCompatPlatformCode) || !isChatapp3HotgameToken(hotgameCompatCallbackToken(raw)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
h.proxyChatapp3HotgameCallback(writer, request, raw, operation)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Handler) proxyChatapp3HotgameCallback(writer http.ResponseWriter, request *http.Request, raw []byte, operation string) {
|
func (h *Handler) proxyChatapp3HotgameCallback(writer http.ResponseWriter, request *http.Request, raw []byte, operation string) {
|
||||||
target, err := hotgameCompatProxyURL(operation, request.URL.RawQuery)
|
target, err := hotgameCompatProxyURL(operation, request.URL.RawQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user