juspay/hyperswitch · error
Etisalat requires SignatureKey auth type
Error message
Etisalat requires SignatureKey auth type
What it means
Etisalat authenticates with a three-part SignatureKey credential (api_key as user name, key1 as password, api_secret as customer), so the unified connector config accepts only `ConnectorAuthType::SignatureKey`. Any other auth type reaches the catch-all arm and returns this error instead of constructing `Self::Etisalat`.
Solutions
- Re-configure the Etisalat credential as `ConnectorAuthType::SignatureKey` providing api_key, key1 and api_secret
- Map Etisalat's user_name, password and customer values to api_key, key1 and api_secret respectively
- Migrate stored merchant_connector_credentials rows that were saved with the wrong auth type
- Test the connector health after re-saving
Example fix
// before
ConnectorAuthType::BodyKey { api_key, key1 }
// after
ConnectorAuthType::SignatureKey {
api_key: etisalat_user,
key1: etisalat_password,
api_secret: etisalat_customer,
} Defensive patterns
Strategy: validation
Validate before calling
fn is_etisalat_auth(auth: &ConnectorAuthType) -> bool {
matches!(auth, ConnectorAuthType::SignatureKey { .. })
}
if !is_etisalat_auth(&auth) {
return Err(report!(ConfigError::InvalidConnectorAuth("Etisalat requires SignatureKey")));
} Type guard
fn as_signature_key(auth: &ConnectorAuthType) -> Option<(&String, &String, &String)> {
match auth {
ConnectorAuthType::SignatureKey { api_key, key1, api_secret } => {
Some((api_key, key1, api_secret))
}
_ => None,
}
} Try / catch
match build_connector_config(Connector::Etisalat, &auth, metadata) {
Ok(cfg) => use_config(cfg),
Err(e) if e.current_context().to_string().contains("SignatureKey") => {
// re-collect api_key, key1, api_secret for Etisalat
}
Err(e) => return Err(e),
} Prevention
- Require all three SignatureKey fields when onboarding Etisalat
- Never reuse single-key connector templates for Etisalat credentials
- Validate credential shape at save time, not at payment time
When it happens
Trigger: Configuring the Etisalat connector with `BodyKey`, `HeaderKey`, `CertificateKey`, or `NoKey`, then attempting any call that resolves the Etisalat connector config in `connector_config.rs`.
Common situations: Merchant supplies only a single API key for Etisalat; provisioning tooling reuses a BodyKey template; partial credential entry where api_secret was omitted so the auth type fell back to a simpler variant.
Related errors
- Datatrans requires BodyKey auth type
- Globalpay requires BodyKey auth type
- Merchante requires BodyKey auth type
- Failed to create GCP KMS client
- Invalid Globalpay metadata format
AI-assisted analysis of juspay/hyperswitch@afd9284352 (2026-09-18).
Data as JSON: /api/errors/b2311c57eb45ca5d.
Report an issue: GitHub.
Appendix: source
Thrown at crates/router/src/core/unified_connector_service/connector_config.rs:1444
client_secret: api_key.clone(),
client_id: key1.clone(),
merchant_id: api_secret.clone(),
}),
_ => Err(err("Moneris requires SignatureKey auth type")),
},
Connector::Etisalat => match auth {
// api_key -> EPG Password, key1 -> EPG UserName,
// api_secret -> EPG Customer (merchant identifier).
ConnectorAuthType::SignatureKey {
api_key,
key1,
api_secret,
} => Ok(Self::Etisalat {
user_name: api_key.clone(),
password: key1.clone(),
customer: api_secret.clone(),
}),
_ => Err(err("Etisalat requires SignatureKey auth type")),
},
Connector::Merchante => match auth {
// api_key -> Merchante Profile Key (32-char secret),
// key1 -> Merchante Profile ID (20-digit merchant id).
// Mirrors the hyperswitch-prism `ConnectorEnum::Merchante` arm.
ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self::Merchante {
profile_key: api_key.clone(),
profile_id: key1.clone(),
}),
_ => Err(err("Merchante requires BodyKey auth type")),
},
Connector::Noon => match auth {
ConnectorAuthType::SignatureKey {
api_key,
key1,
api_secret,
} => Ok(Self::Noon {
api_key: api_key.clone(),View on GitHub (pinned to afd9284352)