Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions TECHNICAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ For example, `EPP_PROVIDER_NAME` becomes `config.providerName` in JavaScript,
- **Provider:** `EPP_PROVIDER_NAME`, `EPP_PROVIDER_AUTH_MODE`, and
`EPP_PROVIDER_ENDPOINT_REGION`.
- **Endpoints:** `EPP_PROVIDER_SMS_ENDPOINT` and `EPP_PROVIDER_VOICE_ENDPOINT`.
- **Timeout and account:** `EPP_PROVIDER_TIMEOUT_MS` and `EPP_PROVIDER_ACCOUNT_NAME`.
- **Timeout:** `EPP_PROVIDER_TIMEOUT_MS`.
- **Key Vault:** `KEY_VAULT_URL` and optional `AZURE_CLIENT_ID`.
- **OAuth:** `EPP_PROVIDER_TENANT_ID`, `EPP_PROVIDER_SCOPE`, `EPP_OUTBOUND_CLIENT_ID`, and
`EPP_OUTBOUND_MI_CLIENT_ID`.
Expand Down Expand Up @@ -344,8 +344,11 @@ Both channel settings are **complete HTTPS URLs**, used unchanged by the adapter
| Global | `https://api.infobip.com/sms/3/messages` | `https://api.infobip.com/tts/3/advanced` |
| EU | `https://api-eu.infobip.com/sms/3/messages` | `https://api-eu.infobip.com/tts/3/advanced` |

Set `EPP_PROVIDER_ACCOUNT_NAME` to an Infobip-approved sender/caller ID and confirm it works for
both intended channels. The adapter's existing `Verify` fallback is not proof of sender approval.
Infobip manages sender selection for SMS and caller ID selection for voice.
The SMS `sender` and voice `from` fields are optional in the published
[SMS schema](https://www.infobip.com/docs/api/channels/sms/outbound-sms/send-message/send-sms-messages)
and [voice schema](https://www.infobip.com/docs/api/channels/voice/voice-message/voice-message-sending-operations/send-advanced-voice-tts).
Confirm provider-side sender/caller configuration and destination coverage for both channels.

### Soprano

Expand Down
1 change: 0 additions & 1 deletion docs/MULTI-PROVIDER-IMPLEMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ The following customer-owned format is not loaded by the sample. Replace each
"EPP_PROVIDER_NAME": "<supported-adapter-name>",
"EPP_PROVIDER_AUTH_MODE": "apiKey",
"EPP_PROVIDER_SMS_ENDPOINT": "<approved-secondary-sms-endpoint-or-base-url>",
"EPP_PROVIDER_ACCOUNT_NAME": "<approved-sender>",
"KEY_VAULT_URL": "https://<secondary-vault>.vault.azure.net",
"AZURE_CLIENT_ID": "<secondary-vault-reader-client-id>"
}
Expand Down
15 changes: 8 additions & 7 deletions docs/ONBOARDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,11 @@ Guided setup supports **Infobip, Soprano, and Telesign**.

| Provider | Authentication | Customer action |
| --- | --- | --- |
| Infobip | OAuth client assertion through managed identity federation | Complete provider-side authorization and configure an approved sender/caller ID in `EPP_PROVIDER_ACCOUNT_NAME`; no Infobip API-key secret |
| Infobip | OAuth client assertion through managed identity federation | Complete provider-side authorization and confirm provider-managed sender/caller selection for both channels; no Infobip API-key secret |
| Soprano | OAuth client assertion through managed identity federation | Complete provider-side authorization and confirm tenant, app, scope, account, and channels |
| Telesign | OAuth client assertion through managed identity federation | Complete [OAuth configuration and handoff](#telesign-oauth-configuration-and-handoff) |

Sinch is bundled but does not have a guided setup profile. Twilio requires the
Twilio requires the
[Add Twilio](BRING-YOUR-OWN-PROVIDER.md) development process.

### Telesign: OAuth configuration and handoff
Expand All @@ -128,7 +128,7 @@ Use a Function package supporting Telesign OAuth and complete the
<a id="where-to-enter-api-key-credentials-in-key-vault"></a>
### Add API-key provider secrets

This applies to API-key adapters such as Sinch, not the guided OAuth providers. Use the exact
This applies to custom API-key adapters, not the bundled OAuth providers. Use the exact
secret names required by the selected adapter.

1. In the deployment summary, find `resources.keyVault`.
Expand All @@ -137,7 +137,7 @@ secret names required by the selected adapter.

![CYOT-CONSTO Key Vault Objects menu with the consto vault name, Secrets selected, and Generate/Import visible](images/onboarding/key-vault-secrets.png)

4. Create the required secret with the raw credential, such as `sinch-api-token` for Sinch.
4. Create each required secret with the raw credential and the exact name specified by your adapter.
5. Verify its name, enabled state, dates, and version without viewing its value.
6. Confirm the Function's system-assigned identity has **Key Vault Secrets User**.

Expand Down Expand Up @@ -182,9 +182,10 @@ access. Then inspect **App registrations > Certificates & secrets > Federated cr
The identity client ID is not the federation subject. Customer-side configuration alone does not
prove provider-side authorization. Verify the integration with an approved controlled live test.

For Infobip, set the Function App's `EPP_PROVIDER_ACCOUNT_NAME` to the approved sender/caller ID
and confirm account access to SMS, voice, and the selected regional host. Do not assume the existing
`Verify` fallback is an approved voice caller ID. No API key or client secret is required.
For Infobip, confirm account access to SMS, voice, and the selected regional host, plus
provider-managed sender/caller selection for the intended destinations.
Authentication uses managed-identity OAuth client assertion.
See the [API schema references](../TECHNICAL.md#infobip).

<a id="validate-the-deployed-endpoint"></a>
<a id="4-package-deploy-and-verify"></a>
Expand Down
1 change: 0 additions & 1 deletion dotnet/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
builder.Services.AddSingleton<PhoneProviderBase, InfobipProvider>();
builder.Services.AddSingleton<PhoneProviderBase, TelesignProvider>();
builder.Services.AddSingleton<PhoneProviderBase, SopranoProvider>();
builder.Services.AddSingleton<PhoneProviderBase, SinchProvider>();

builder.Services.AddSingleton<CredentialTokenService>();
builder.Services.AddSingleton<SendOtp>();
Expand Down
9 changes: 2 additions & 7 deletions dotnet/Src/Providers/InfobipProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,15 @@ public override Task<ProviderResult> SendOtpAsync(
string channel, string endpoint, OtpDelivery delivery, ProviderCredentials credentials,
IEnv env, HttpClient client, int timeoutMs, ILogger? logger = null) =>
SendJsonAsync<Response>(
() => CreateRequest(channel, endpoint, delivery, credentials, env),
() => CreateRequest(channel, endpoint, delivery, credentials),
MapResponse,
client,
timeoutMs,
logger);

private static HttpRequestMessage CreateRequest(
string channel, string endpoint, OtpDelivery delivery, ProviderCredentials credential, IEnv env)
string channel, string endpoint, OtpDelivery delivery, ProviderCredentials credential)
{
var senderId = env.Get("EPP_PROVIDER_ACCOUNT_NAME") ?? "Verify";
var messageId = delivery.CorrelationId ?? delivery.MessageId;
object body;

Expand All @@ -44,7 +43,6 @@ private static HttpRequestMessage CreateRequest(
body = new VoiceRequest(
[
new VoiceMessage(
senderId,
[new Destination(delivery.PhoneNumber, messageId)],
delivery.Message,
delivery.Locale ?? "en",
Expand All @@ -56,7 +54,6 @@ [new Destination(delivery.PhoneNumber, messageId)],
body = new SmsRequest(
[
new SmsMessage(
senderId,
[new Destination(delivery.PhoneNumber, messageId)],
new SmsContent(delivery.Message))
]);
Expand Down Expand Up @@ -105,7 +102,6 @@ private sealed record SmsRequest(
[property: JsonPropertyName("messages")] IReadOnlyList<SmsMessage> Messages);

private sealed record SmsMessage(
[property: JsonPropertyName("sender")] string Sender,
[property: JsonPropertyName("destinations")] IReadOnlyList<Destination> Destinations,
[property: JsonPropertyName("content")] SmsContent Content);

Expand All @@ -116,7 +112,6 @@ private sealed record VoiceRequest(
[property: JsonPropertyName("messages")] IReadOnlyList<VoiceMessage> Messages);

private sealed record VoiceMessage(
[property: JsonPropertyName("from")] string From,
[property: JsonPropertyName("destinations")] IReadOnlyList<Destination> Destinations,
[property: JsonPropertyName("text")] string? Text,
[property: JsonPropertyName("language")] string Language,
Expand Down
134 changes: 0 additions & 134 deletions dotnet/Src/Providers/SinchProvider.cs

This file was deleted.

Loading
Loading