{"record":{"id":"b2311c57eb45ca5d","repo":"juspay/hyperswitch","slug":"etisalat-requires-signaturekey-auth-type","errorCode":null,"errorMessage":"Etisalat requires SignatureKey auth type","messagePattern":"Etisalat requires SignatureKey auth type","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/router/src/core/unified_connector_service/connector_config.rs","lineNumber":1444,"sourceCode":"                    client_secret: api_key.clone(),\n                    client_id: key1.clone(),\n                    merchant_id: api_secret.clone(),\n                }),\n                _ => Err(err(\"Moneris requires SignatureKey auth type\")),\n            },\n            Connector::Etisalat => match auth {\n                // api_key -> EPG Password, key1 -> EPG UserName,\n                // api_secret -> EPG Customer (merchant identifier).\n                ConnectorAuthType::SignatureKey {\n                    api_key,\n                    key1,\n                    api_secret,\n                } => Ok(Self::Etisalat {\n                    user_name: api_key.clone(),\n                    password: key1.clone(),\n                    customer: api_secret.clone(),\n                }),\n                _ => Err(err(\"Etisalat requires SignatureKey auth type\")),\n            },\n            Connector::Merchante => match auth {\n                // api_key -> Merchante Profile Key (32-char secret),\n                // key1    -> Merchante Profile ID  (20-digit merchant id).\n                // Mirrors the hyperswitch-prism `ConnectorEnum::Merchante` arm.\n                ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self::Merchante {\n                    profile_key: api_key.clone(),\n                    profile_id: key1.clone(),\n                }),\n                _ => Err(err(\"Merchante requires BodyKey auth type\")),\n            },\n            Connector::Noon => match auth {\n                ConnectorAuthType::SignatureKey {\n                    api_key,\n                    key1,\n                    api_secret,\n                } => Ok(Self::Noon {\n                    api_key: api_key.clone(),","sourceCodeStart":1426,"sourceCodeEnd":1462,"githubUrl":"https://github.com/juspay/hyperswitch/blob/afd92843521ced2c6856b98ae4ea332e75102d88/crates/router/src/core/unified_connector_service/connector_config.rs#L1426-L1462","documentation":"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`.","triggerScenarios":"Configuring the Etisalat connector with `BodyKey`, `HeaderKey`, `CertificateKey`, or `NoKey`, then attempting any call that resolves the Etisalat connector config in `connector_config.rs`.","commonSituations":"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.","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"],"exampleFix":"// before\nConnectorAuthType::BodyKey { api_key, key1 }\n// after\nConnectorAuthType::SignatureKey {\n    api_key: etisalat_user,\n    key1: etisalat_password,\n    api_secret: etisalat_customer,\n}","handlingStrategy":"validation","validationCode":"fn is_etisalat_auth(auth: &ConnectorAuthType) -> bool {\n    matches!(auth, ConnectorAuthType::SignatureKey { .. })\n}\nif !is_etisalat_auth(&auth) {\n    return Err(report!(ConfigError::InvalidConnectorAuth(\"Etisalat requires SignatureKey\")));\n}","typeGuard":"fn as_signature_key(auth: &ConnectorAuthType) -> Option<(&String, &String, &String)> {\n    match auth {\n        ConnectorAuthType::SignatureKey { api_key, key1, api_secret } => {\n            Some((api_key, key1, api_secret))\n        }\n        _ => None,\n    }\n}","tryCatchPattern":"match build_connector_config(Connector::Etisalat, &auth, metadata) {\n    Ok(cfg) => use_config(cfg),\n    Err(e) if e.current_context().to_string().contains(\"SignatureKey\") => {\n        // re-collect api_key, key1, api_secret for Etisalat\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["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"],"tags":["rust","authentication","connector-config","etisalat"],"backgroundTag":"unsupported-enum-value","analyzedSha":"afd92843521ced2c6856b98ae4ea332e75102d88","analyzedAt":"2026-09-18T01:18:02.947Z","contentChangedAt":"2026-09-18T01:18:02.947Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}