fix: stabilize gateway device token reissue
This commit is contained in:
parent
28a7eb3343
commit
6a405a00e5
@ -92,20 +92,7 @@ func handleGatewayConnect(
|
|||||||
server.gateway = gatewayruntime.NewManager()
|
server.gateway = gatewayruntime.NewManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
result := server.gateway.Connect(request, notify)
|
result := connectOpenClawGateway(server.gateway, request, notify, usesBridgeIdentity)
|
||||||
if usesBridgeIdentity && shouldRetryOpenClawGatewayWithSharedToken(result) {
|
|
||||||
clearBridgeGatewayDeviceToken()
|
|
||||||
request.Auth.DeviceToken = ""
|
|
||||||
request.HasDeviceToken = false
|
|
||||||
request.Auth.Token = bridgeSharedAuthToken()
|
|
||||||
request.HasSharedAuth = strings.TrimSpace(request.Auth.Token) != ""
|
|
||||||
if request.HasSharedAuth {
|
|
||||||
request.ConnectAuthMode = "shared-token"
|
|
||||||
request.ConnectAuthFields = []string{"token"}
|
|
||||||
request.ConnectAuthSources = []string{"bridge:repair"}
|
|
||||||
result = server.gateway.Connect(request, notify)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if result.OK && usesBridgeIdentity {
|
if result.OK && usesBridgeIdentity {
|
||||||
saveBridgeGatewayDeviceToken(result.ReturnedDeviceToken)
|
saveBridgeGatewayDeviceToken(result.ReturnedDeviceToken)
|
||||||
}
|
}
|
||||||
@ -297,20 +284,7 @@ func ensureProductionGatewayConnected(
|
|||||||
request.Auth.DeviceToken = deviceToken
|
request.Auth.DeviceToken = deviceToken
|
||||||
request.HasDeviceToken = deviceToken != ""
|
request.HasDeviceToken = deviceToken != ""
|
||||||
request.ReportedRemoteAddress = resolveGatewayReportedRemoteAddress(server, request)
|
request.ReportedRemoteAddress = resolveGatewayReportedRemoteAddress(server, request)
|
||||||
result := server.gateway.Connect(request, notify)
|
result := connectOpenClawGateway(server.gateway, request, notify, true)
|
||||||
if shouldRetryOpenClawGatewayWithSharedToken(result) {
|
|
||||||
clearBridgeGatewayDeviceToken()
|
|
||||||
request.Auth.DeviceToken = ""
|
|
||||||
request.HasDeviceToken = false
|
|
||||||
request.Auth.Token = bridgeSharedAuthToken()
|
|
||||||
request.HasSharedAuth = strings.TrimSpace(request.Auth.Token) != ""
|
|
||||||
if request.HasSharedAuth {
|
|
||||||
request.ConnectAuthMode = "shared-token"
|
|
||||||
request.ConnectAuthFields = []string{"token"}
|
|
||||||
request.ConnectAuthSources = []string{"bridge:repair"}
|
|
||||||
result = server.gateway.Connect(request, notify)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if result.OK {
|
if result.OK {
|
||||||
saveBridgeGatewayDeviceToken(result.ReturnedDeviceToken)
|
saveBridgeGatewayDeviceToken(result.ReturnedDeviceToken)
|
||||||
return nil
|
return nil
|
||||||
@ -323,6 +297,28 @@ func ensureProductionGatewayConnected(
|
|||||||
return &shared.RPCError{Code: -32002, Message: "GATEWAY_CONNECT_FAILED: " + message}
|
return &shared.RPCError{Code: -32002, Message: "GATEWAY_CONNECT_FAILED: " + message}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func connectOpenClawGateway(
|
||||||
|
manager *gatewayruntime.Manager,
|
||||||
|
request gatewayruntime.ConnectRequest,
|
||||||
|
notify func(map[string]any),
|
||||||
|
usesBridgeIdentity bool,
|
||||||
|
) gatewayruntime.ConnectResult {
|
||||||
|
result := manager.Connect(request, notify)
|
||||||
|
if !usesBridgeIdentity || !shouldRetryOpenClawGatewayWithSharedToken(result) {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
clearBridgeGatewayDeviceToken()
|
||||||
|
request.Auth.DeviceToken = ""
|
||||||
|
request.HasDeviceToken = false
|
||||||
|
request.Auth.Token = bridgeSharedAuthToken()
|
||||||
|
request.HasSharedAuth = true
|
||||||
|
request.ConnectAuthMode = "shared-token"
|
||||||
|
request.ConnectAuthFields = []string{"token"}
|
||||||
|
request.ConnectAuthSources = []string{"bridge:device-token-reissue"}
|
||||||
|
return manager.Connect(request, notify)
|
||||||
|
}
|
||||||
|
|
||||||
func shouldRetryOpenClawGatewayWithSharedToken(result gatewayruntime.ConnectResult) bool {
|
func shouldRetryOpenClawGatewayWithSharedToken(result gatewayruntime.ConnectResult) bool {
|
||||||
if result.OK || strings.TrimSpace(bridgeSharedAuthToken()) == "" {
|
if result.OK || strings.TrimSpace(bridgeSharedAuthToken()) == "" {
|
||||||
return false
|
return false
|
||||||
|
|||||||
@ -360,7 +360,11 @@ func sameConnectTarget(current ConnectRequest, next ConnectRequest) bool {
|
|||||||
strings.TrimSpace(current.Endpoint.Host) == strings.TrimSpace(next.Endpoint.Host) &&
|
strings.TrimSpace(current.Endpoint.Host) == strings.TrimSpace(next.Endpoint.Host) &&
|
||||||
current.Endpoint.Port == next.Endpoint.Port &&
|
current.Endpoint.Port == next.Endpoint.Port &&
|
||||||
current.Endpoint.TLS == next.Endpoint.TLS &&
|
current.Endpoint.TLS == next.Endpoint.TLS &&
|
||||||
normalizeEndpointPath(current.Endpoint.Path) == normalizeEndpointPath(next.Endpoint.Path)
|
normalizeEndpointPath(current.Endpoint.Path) == normalizeEndpointPath(next.Endpoint.Path) &&
|
||||||
|
strings.TrimSpace(current.Identity.DeviceID) == strings.TrimSpace(next.Identity.DeviceID) &&
|
||||||
|
strings.TrimSpace(current.Auth.Token) == strings.TrimSpace(next.Auth.Token) &&
|
||||||
|
strings.TrimSpace(current.Auth.DeviceToken) == strings.TrimSpace(next.Auth.DeviceToken) &&
|
||||||
|
strings.TrimSpace(current.Auth.Password) == strings.TrimSpace(next.Auth.Password)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *session) connectAttempt() (ConnectResult, *GatewayError) {
|
func (s *session) connectAttempt() (ConnectResult, *GatewayError) {
|
||||||
@ -412,11 +416,6 @@ func (s *session) connectAttempt() (ConnectResult, *GatewayError) {
|
|||||||
snapshotPayload := asMap(payload["snapshot"])
|
snapshotPayload := asMap(payload["snapshot"])
|
||||||
sessionDefaults := asMap(snapshotPayload["sessionDefaults"])
|
sessionDefaults := asMap(snapshotPayload["sessionDefaults"])
|
||||||
returnedDeviceToken := strings.TrimSpace(stringValue(auth["deviceToken"]))
|
returnedDeviceToken := strings.TrimSpace(stringValue(auth["deviceToken"]))
|
||||||
if returnedDeviceToken != "" {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.config.Auth.DeviceToken = returnedDeviceToken
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
negotiatedScopes := stringSlice(auth["scopes"])
|
negotiatedScopes := stringSlice(auth["scopes"])
|
||||||
negotiatedRole := strings.TrimSpace(stringValue(auth["role"]))
|
negotiatedRole := strings.TrimSpace(stringValue(auth["role"]))
|
||||||
if negotiatedRole == "" {
|
if negotiatedRole == "" {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user