Using Cisco Collaboration Single Sign-On with Cisco Unity Connection Messaging Interface

The ‘Cisco Unity Connection Messaging Interface’ (CUMI) provides a client-side interface allowing end-users to read and update Unity Connection messaging information and settings specific to their mailbox and account. For more information on CUMI, please see the CUMI DevCenter

Starting with version 10.5, several Cisco UC APIs, including CUMI, support authentication via the Cisco UC Single Sign-On mechanism. This has several advantages, allowing users to sign in to CUC once and re-use their session across multiple UC web applications and API interfaces.

This document provides a browser-based example showing how to use a SSO token to access a CUMI API. Note that a pre-requisite to using a SSO API like CUMI, is that the application must first interact with Cisco UC SSO to authenticate the user and obtain a SSO token. For further background on Cisco UC SSO and an example showing how to obtain a SSO token via browser app, please see the Cisco Unified Communications Single Sign-On Tutorial.

Once you have an SSO access token, you are ready to use it with CUMI.

Standard Basic Authorization

//Basic Auth Example
        GET https://ds-cuc105.cisco.com/vmrest/mailbox/folders/inbox/messages HTTP/1.1
        Host: ds-cuc105.cisco.com
        User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/32.0
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        Accept-Language: en-US,en;q=0.5
        Accept-Encoding: gzip, deflate
        Authorization: Basic dXNlcjE6Y2lzY28hMTIz
        Referer: https://app.example.com/ssocumi.html
        Origin: https://app.example.com
        Connection: keep-alive
        

By default, CUMI authenticates users via the HTTP ‘Basic Authorization’ mechanism. This requires that the HTTP request to CUMI include an ‘Authorization’ header, with value of ‘Basic’ plus a base64-encoded username:password, e.g: Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

SSO Bearer Authorization

//Bearer Auth Example
        GET https://ds-cuc105.cisco.com/vmrest/mailbox/folders/inbox/messages HTTP/1.1
        Host: ds-cuc105.cisco.com
        User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/32.0
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        Accept-Language: en-US,en;q=0.5
        Accept-Encoding: gzip, deflate
        Authorization: Bearer MjpkMTI2NDgyOS1mMDg1LTRhY2UtOGM3Yy1hMmY0ZjQ0ODUxNGQ
        Referer: https://app.example.com/ssocumi.html
        Origin: https://app.example.com
        Connection: keep-alive
        

In order to use SSO, the same ‘Authorization’ header is used, but the auth type becomes ‘Bearer’ plus the SSO token (NOT base64-encoded), e.g.: Authorization: Bearer Mjo1NTU5ZmFkYS02MjYwLTQ0YTktOTRhNS1iY2RmNzcwZWQzZDE

Cross-Origin Resource Sharing

For security reasons, web browsers by default prevent Javascript served by one 'origin' from accessing data served by another origin (an origin is a combination of scheme - e.g. 'HTTPS' - hostname, and port.) For example Javascript on a page served from https://app.example.com cannot access data retrieved via XMLHttpRequest from https://unityconnection.example.com (e.g. to make a CUMI request.)

To allow these types of requests securely, the Cross-Origin Resource Sharing standard was developed (supported in all modern browsers:) http://www.w3.org/TR/cors

CORS involves the use of special HTTP request headers and ‘pre-flight’ OPTIONS requests, and is generally handled transparently by browsers. However, it is necessary to configure the web server (in this case Cisco UCM) to allow Cross-Origin requests, on an origin-by-origin basis.

CUC supports configuration of CORS applications via the Cross-Origin Resource Sharing (CORS) menu:

CORS config

For each browser-based application that will be using CUC SSO APIs, configure a CORS entry: include the protocol scheme (i.e. ‘https://’) domain and port (if not default :80 or :443), e.g. https://app.example.com

Preparing Your Environment

Successfully accessing UC SSO APIs from an application assumes that some general system services and configurations are in place:

  • HTTPS - All connections involved with SSO and CUMI are secured with HTTPS. Applications and browsers must be configured with the correct certificates in order to connect securely. (For lab testing, you may be able to temporarily accept certificates in the browser).
  • DNS - HTTPS certificates and the URLs involved in the SSO API sequence typically use hostnames (vs. IP addresses). The UC and application hosts should be configured in DNS. (For lab/testing, you may be able to use your PC’s ‘hosts’ file to map hostnames to IPs locally)
  • UC SSO - SSO should be fully configured and working with CUC, e.g. end-users can access CUC web apps like ‘Inbox’ using their SSO credentials.

Example Browser-based CUMI REST Request

The example HTML/javascript covered in this document gathers a CUC host name and SSO token (previously obtained, as above) from browser input fields, and makes a CUMI API ‘GET’ request to the Inbox resource, gathering some information about the users voicemail inbox. The CUMI XML response is shown in the browser upon success.

Get Ready...

Note: in order for this sample to work, the following setup steps should be completed:

1) Confirm that SSO is available and running in your environment. Take note of the CUC host name.

2) Make sure the CUC host and your web server host can be resolved via DNS (manual entries in your PC’s ‘hosts’ file can help during testing).

3) Obtain a valid set of SSO login credentials that will work with your SSO Identity Provider (IdP). With this set of credentials, obtain a UC SSO access token, e.g. using the sample application found in the Common SSO Tutorial[link].

4) Confirm that you have a web server capable of serving HTTPS requests for files you supply. Copy ssocumi.html to the correct directory for your web server’s HTTPS site.

6) Verify that CORS has been enabled on CUC for your web server’s origin/domain.

7) Verify that SSL certificates for CUC and your web server have been imported/enabled in your web browser.

Sample Code Walk-Through

Creating the XMLHttpRequest Object

var xmlhttp=new XMLHttpRequest();  //Create XML request object
        xmlhttp.open('GET','https://'+cucHost+'/vmrest/mailbox/folders/inbox/messages');  //CUC REST API to retrieve mailbox info
        

After retrieving the UCM host SSO token from the HTML input fields, the Javascript code creates the XMLHttpRequest object used to make the CUMI request.

Adding the Accept Header

xmlhttp.setRequestHeader('Accept','application/xml');
        

The next step adds the Accept: application/xml header to the HTTP request, to indicate to CUMI that the application expects an XML response.

Adding the Authorization: Bearer Header

xmlhttp.setRequestHeader("Authorization","Bearer "+ssoToken); //Add 'Authorization' header with 'Bearer' and token
        

Next, the code adds the Authorization header, including the Bearer type and the SSO token to authenticate the CUC user.

Handling the XMLHttpRequest Completion Event

xmlhttp.onreadystatechange=function() {  //Handle completion event of the XML request
            if (xmlhttp.readyState==4) {         //State is complete
                if (xmlhttp.status==200) {       //Status is 200 OK
                    var xml=new XMLSerializer().serializeToString(xmlhttp.responseXML); //Extract the XML string from the response
                document.getElementsByName("response")[0].value=xml; //Display the XML in the text area
                }
            }
        }
        

This block of code sets an event handler for the XMLHttpRequest objects’s completion event. If the event is called with state=4 (complete) and status=200 (200 OK), then the code extracts the XML response and displays it in the web page text area.

Launching the XMLHttpRequest

xmlhttp.send(); //Launch the XML request
        

Once the XMLHttpRequest has been prepared, and the event handler is in place, the actual request is launched as the final step.

Sample REST Response

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Messages total="1">
          <Message>
            <Subject>test</Subject>
            <Read>true</Read>
            <Dispatch>false</Dispatch>
            <Secure>false</Secure>
            <Priority>Normal</Priority>
            <Sensitivity>Normal</Sensitivity>
            <URI>/vmrest/messages/0:66c77193-73bf-4da3-a0c2-5b04d8af9f0b</URI>
            <MsgId>0:66c77193-73bf-4da3-a0c2-5b04d8af9f0b</MsgId>
            <From>
              <DisplayName>user</DisplayName>
              <SmtpAddress>user1@ds-cuc105.cisco.com</SmtpAddress>
              <DtmfAccessId>2000</DtmfAccessId>
            </From>
            <CallerId>
              <CallerNumber>2000</CallerNumber>
              <CallerName>user</CallerName>
            </CallerId>
            <ArrivalTime>1412103349000</ArrivalTime>
            <Size>21174</Size>
            <Duration>1880</Duration>
            <IMAPUid>1</IMAPUid>
            <FromSub>true</FromSub>
            <MsgType>Voice</MsgType>
          </Message>
        </Messages>


        

If everything went well, CUMI should respond to the request with a 200 OK status and include some XML info about the user’s inbox. For full details about the contents of the CUMI inbox resource response, see the CUMI API Reference