.. _external-provisioning:
=====================
External Provisioning
=====================
External provisioning is an optional extension to Cloud Softphone’s standard provisioning workflow. It allows providers
to apply dynamic logic at the moment the app signs in or activates, making it possible to integrate with backend systems,
enforce business rules, and supply configuration or credentials that depend on the individual user. This adds a flexible,
real-time layer on top of the static provisioning defined in the Cloud Softphone portal.
External provisioning is commonly used for:
- Access control and session management.
- Issuing user-specific SIP credentials.
- Returning per-user configuration overrides.
- Creating new users during onboarding.
From a technical perspective, the external provisioning endpoint is invoked after the app downloads its base provisioning
from the Cloud Softphone portal. The app sends a set of input parameters, including username and password, to the
provider’s web service. The service returns an :ref:`account-xml` document, which is merged with the default provisioning
to produce the final configuration used by the app.
Web Service Definition
======================
External provisioning consists of two related but separately configurable web services:
- 1. Initial external provisioning, triggered when the user signs in or activates the app for the first time
- 2. Re-provisioning, triggered automatically on app startup and periodically if enabled
Both web services are configured in the Cloud Softphone portal and follow the standard :ref:`web-service-definition`
syntax, but each uses its own prefix and placeholder rules.
Initial External Provisioning
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Initial external provisioning uses the prefix ``InitialProvisioning``, for example:
- ``InitialProvisioningUrl``
- ``InitialProvisioningPostData``
- ``InitialProvisioningMethod``
At this stage, the app has not yet created an account, so the web service receives parameters directly from the initial
login screen. The following placeholders are available:
- ``%username%`` — the username entered by the user
- ``%password%`` — the password entered by the user
- ``%fullcode%`` — the Cloud ID of the application
These placeholders are expanded directly in the URL or request body before the web service is called.
Account XML does not yet exist at this stage; ``%account[...]%`` cannot be used during initial provisioning. The
``%username%`` and ``%password%`` values come directly from the login screen.
Re-Provisioning
~~~~~~~~~~~~~~~
Re-provisioning uses the prefix ``extProv``:
- ``extProvUrl`` - the URL of the re-provisioning web service
- ``extProvMethod`` - the HTTP method to use for the re-provisioning web service
- ``extProvPostData`` - the POST data to send to the re-provisioning web service
- ``extProvInterval`` - the interval in seconds at which the app will automatically call the re-provisioning web service
- ``extProvLogoutStatusCode`` - the HTTP status code to return to trigger logout
Unlike initial provisioning, re-provisioning operates on an existing account. Because of this, the service must use the
``%account[...]%`` placeholder syntax to access values stored in the Account XML, such as:
- ``%account[username]%``
- ``%account[password]%``
- ``%account[X-install-id]%``
The initial placeholders ``%username%`` and ``%password%`` do not work during re-provisioning and must be wrapped in
``account[...]``.
.. warning::
During re‑provisioning, ``%username%`` and ``%password%`` DO NOT expand. They must be referenced as
``%account[username]%`` and ``%account[password]%``.
Re‑provisioning executes on application startup and, if enabled via ``extProvInterval``, the app will periodically re-call the re-provisioning web service using the
``extProv*`` parameters.
- The app sends ``If-Modified-Since`` header, allowing the provider to return ``304 Not Modified``.
- If ``200 OK`` is returned with updated Account XML, the app merges the changes and refreshes the account.
.. warning::
The default value for ``extProvInterval`` is 0, which means that external re-provisioning will be called only when
creating or editing account. To enable periodical automatic re-provisioning, specify non-zero value of
``extProvInterval`` in your Account XML.
.. note::
To avoid conflicts, the account is not modified when Settings page of the application is open, or if there is a call
in progress. As soon as the user closes Settings and/or all calls end, the changes are applied.
Web Service Response
====================
The external provisioning web service must respond with an HTTP ``2xx OK`` status code and an XML body containing the
root node:
`` ... ``
The ``Content-Type`` should be ``application/xml``. The XML subtree inside the ```` node represents the
:ref:`account-xml` and will be merged into the app’s configuration.
The XML must contain exactly one ```` root node; additional nodes or wrappers are ignored. When merging, nodes
returned in the ```` XML override values from the base provisioning.
If the service returns a non-``2xx`` status code, the provisioning process stops and the app shows a generic error
message. To display a custom error message, return a non-``2xx`` status and include:
.. code-block:: xml
Custom error message comes here
Example of Successful External Provisioning
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Request
.. code-block:: http
GET /prov?cloud_username=johndow&cloud_password=12345678&cloud_id=EXAMPLE&initialScreen=1 HTTP/1.1
Host: provider.com
Connection: close
Cache-Control: max-age=0
User-Agent: CloudSoftphone/1.5.6
Response
.. code-block:: http
HTTP/1.1 200 OK
Date: Sun, 15 Mar 2015 00:46:17 GMT
Server: Apache/2.4.7 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 183
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/xml
B63349F4EE
45F4BF5F0E191F5DCC27
0
AD4535EF902BB13
This example demonstrates initial provisioning returning dynamically assigned SIP credentials.
Use Cases for External Provisioning
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
External provisioning gives providers granular control over account setup and ongoing configuration. Typical use cases
include:
1. Delivering SIP Credentials Without Exposing Them to the End User
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Many providers authenticate users using email, phone number, customer ID, or another identifier that is not the
actual SIP username. External provisioning allows:
- The user to sign in using a simple credential
- The provider’s backend to validate the user
- The backend to return the real SIP username and password inside the ```` XML
This ensures each user receives the correct SIP credentials without ever seeing or learning those credentials.
2. Per-User Configuration Overrides
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Providers can adjust configuration dynamically for individual users. Any parameter from :ref:`account-xml`
can be overridden based on:
- Service tier
- Subscription level
- Device type
- Backend rules
For example, disabling messaging for a specific user:
.. code-block:: xml
0
Or enabling/disabling other features on a per-user basis.
3. Controlling Access to Features
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
External provisioning can be used to tailor feature availability at the user level. Examples include:
- Linkup Messaging (``0``)
- Conferencing (``0``)
- Any provider-defined add-on service
This gives providers precise control over which capabilities are available to each user.
4. Adding Custom Account Parameters
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Providers may return additional XML nodes to store metadata or internal identifiers. These values are preserved in
the account and can be referenced later using:
``%account[customNode]%``
For example:
.. code-block:: xml
AD4535EF902BB13
This can be used for analytics, tracking, device registration, or routing logic.
5. User Onboarding and Automatic Account Creation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Initial external provisioning can serve as an integration hook for creating users in the provider’s backend.
Typical flows include:
- Creating a SIP account during activation
- Allocating phone numbers or extensions
- Initializing service resources for first-time users
This allows providers to offer a smooth sign-up or activation experience without requiring manual backend operations.
.. note::
Feature overrides returned by external provisioning (for example ``allowMessage`` or ``linkupMessagingEnabled``)
override portal defaults during merge. However, paid or licensed features must still be enabled in the Cloud
Softphone portal for them to be configurable via external provisioning.
6. Enforcing Logout via External Provisioning
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
External provisioning can be used to enforce user logout based on a specific HTTP status code returned by the
re‑provisioning web service. See :ref:`enforcing-logout-via-external-provisioning` for more details.
Enforcing Logout via External Provisioning
==========================================
Overview
~~~~~~~~
Mobile and desktop applications can enforce a user logout based on a specific HTTP status code returned by the external
re‑provisioning web service. This is configured using the ``extProvLogoutStatusCode`` parameter in the
:ref:`web-service-definition`.
Purpose
~~~~~~~
This mechanism is helpful in scenarios such as:
- Off‑boarding customers or employees
- Enforcing password resets or credential rotation
- Temporary access revocation
How to Configure
~~~~~~~~~~~~~~~~
In the Cloud Softphone portal, set the parameter for re‑provisioning:
- ``extProvLogoutStatusCode``
Set this value to the HTTP status code your provisioning service will return to trigger logout.
For example, if ``extProvLogoutStatusCode = 410``, returning HTTP ``410 Gone`` from the provisioning server forces
immediate logout.
Behavior on Logout
~~~~~~~~~~~~~~~~~~
When the provisioning web service returns the configured status code:
- The user is unregistered from SIP.
- The application notifies the :ref:`account_removal_reporter_webservice` (if configured).
- A local encrypted backup is created, containing Preferences, local call history, and Quickdials. On the next
successful login, the backup is automatically restored.