Skip to content

Commit 4c2c6df

Browse files
feat(bridge): add return_to_url to encrypted bridge request payload (#251)
Include the optional return_to URL in the encrypted payload sent to the bridge (serialized as "return_to_url"), so the World App can read it from the request body in addition to the connector URL query parameter. Closes APP-9434 Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 453c340 commit 4c2c6df

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

rust/core/src/bridge.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ struct BridgeRequestPayload {
123123

124124
/// Environment for the bridge request
125125
environment: Environment,
126+
127+
/// Optional deep-link callback URL for the World App to redirect to after verification.
128+
#[serde(skip_serializing_if = "Option::is_none", rename = "return_to_url")]
129+
return_to: Option<String>,
126130
}
127131

128132
/// Encrypted payload sent to/from the bridge
@@ -549,6 +553,7 @@ pub fn build_request_payload(
549553
timestamp,
550554
allow_legacy_proofs: params.allow_legacy_proofs,
551555
environment: params.environment.unwrap_or_default(),
556+
return_to: params.return_to.clone(),
552557
};
553558

554559
serde_json::to_value(&payload).map_err(Into::into)
@@ -1793,6 +1798,7 @@ mod tests {
17931798
identity_attributes: None,
17941799
allow_legacy_proofs: false,
17951800
environment: Environment::Production,
1801+
return_to: None,
17961802
};
17971803

17981804
let json = serde_json::to_string(&payload).unwrap();
@@ -2411,6 +2417,77 @@ mod tests {
24112417
assert!(payload_bridge.get("timestamp").is_none());
24122418
}
24132419

2420+
#[test]
2421+
fn test_build_request_payload_includes_return_to_when_provided() {
2422+
let app_id = AppId::new("app_test").unwrap();
2423+
let sig = "0x".to_string() + &"00".repeat(64) + "1b";
2424+
let rp_context = RpContext::new(
2425+
"rp_1234567890abcdef",
2426+
"0x0000000000000000000000000000000000000000000000000000000000000001",
2427+
1_700_000_000,
2428+
1_700_003_600,
2429+
&sig,
2430+
)
2431+
.unwrap();
2432+
2433+
let params = BridgeConnectionParams {
2434+
app_id,
2435+
kind: RequestKind::Uniqueness {
2436+
action: "my-action".to_string(),
2437+
},
2438+
constraints: None,
2439+
rp_context,
2440+
action_description: None,
2441+
legacy_verification_level: VerificationLevel::Orb,
2442+
legacy_signal: "test-signal".to_string(),
2443+
bridge_url: None,
2444+
allow_legacy_proofs: false,
2445+
override_connect_base_url: None,
2446+
return_to: Some("idkitsample://callback".to_string()),
2447+
environment: None,
2448+
identity_attributes: None,
2449+
};
2450+
2451+
let payload = build_request_payload(&params, false).unwrap();
2452+
assert_eq!(payload["return_to_url"], "idkitsample://callback");
2453+
assert!(payload.get("return_to").is_none());
2454+
}
2455+
2456+
#[test]
2457+
fn test_build_request_payload_omits_return_to_when_none() {
2458+
let app_id = AppId::new("app_test").unwrap();
2459+
let sig = "0x".to_string() + &"00".repeat(64) + "1b";
2460+
let rp_context = RpContext::new(
2461+
"rp_1234567890abcdef",
2462+
"0x0000000000000000000000000000000000000000000000000000000000000001",
2463+
1_700_000_000,
2464+
1_700_003_600,
2465+
&sig,
2466+
)
2467+
.unwrap();
2468+
2469+
let params = BridgeConnectionParams {
2470+
app_id,
2471+
kind: RequestKind::Uniqueness {
2472+
action: "my-action".to_string(),
2473+
},
2474+
constraints: None,
2475+
rp_context,
2476+
action_description: None,
2477+
legacy_verification_level: VerificationLevel::Orb,
2478+
legacy_signal: "test-signal".to_string(),
2479+
bridge_url: None,
2480+
allow_legacy_proofs: false,
2481+
override_connect_base_url: None,
2482+
return_to: None,
2483+
environment: None,
2484+
identity_attributes: None,
2485+
};
2486+
2487+
let payload = build_request_payload(&params, false).unwrap();
2488+
assert!(payload.get("return_to_url").is_none());
2489+
}
2490+
24142491
#[test]
24152492
fn test_legacy_payload_hashes_address_shaped_signal_as_raw_bytes() {
24162493
let address = "0x3df41d9d0ba00d8fbe5a9896bb01efc4b3787b7c";

0 commit comments

Comments
 (0)