Using the Skype for Business UCWA API in a Microsoft Teams Tab application to show the Skype Conversation history
One of the things you maybe considering in the new year is migrating from Skype for Business to Microsoft Teams. In this post I'm going to demonstrate how you can use the UCWA api (which is the REST API you can use to talk to a Skype for Business server either in Office365 or OnPrem) to access Skype for Business from within the Teams Client via a Teams Tab application. (For those unacquainted with UCWA this the API that is used to Access Skype within OWA).
Why would you want to do this ? its one way of easing migration friction by providing a different level of interoperability (outside of using both clients) and also a way of adding functionality into the Teams client that isn't there currently. In this post I'm going to look at showing the users Skype conversation history, while this information is also stored in a users Mailbox and also a ccessible via the Graph API, in this app I'm going to use the UCWA API to access the conversation logs via the Skype for Business Online servers and also the conversation transcripts. What you end up with is a Teams tab that looks like the following
and the Transcripts like (this is POC so mind the formatting)
Using UCWA from a Teams Tab Application
There isn't much difference between using the UCWA API in a Teams Tab application then from using it in any other application, however UCWA does present some challenges around authentication because of the way the discovery process works. For a quick recap for those unacquainted please read https://docs.microsoft.com/en-us/skype-sdk/ucwa/developingucwaapplicationsforsfbonline . As part of that process you need to get an AccessToken to make a discovery request to find the SK4B pool server to use and then get another AccessToken for the pool server. So when using the Teams Tab Silent authentication flow you need to execute this twice (which is different and more time consuming then say a normal Graph type application)
Getting the Conversation History in UCWA
Once you have logged into UCWA you need to configured the session to enabled the conversation history as its disabled by default. This involves doing a Put request against the application resource. with the if/match header set to the ETag. You then need to acknowledge the event this will generate and once that is done your UCWA session will be ready to go, you then just need to query the communication resource to get the links required to access the ConversationLogs from the server. In the sample app I'm only accessing the last 50 items from the server as this is only a POC anyway. When it comes to access the conversation transcripts this requires a Batch request to make it efficient (the max batch size in SK4B in 100) so using a page size of 50 keeps this all working okay. A brief overview of the requests required to access the Conversation history.
https://login.microsoftonline.com/common/adminconsent?client_id=08401c36-6179-4bbe-9bcc-d34ff51d828f
(Note if you don't see the "upload a custom app" check that you have side loading of apps enabled in your tenant config)
Getting the Conversation History in UCWA
Once you have logged into UCWA you need to configured the session to enabled the conversation history as its disabled by default. This involves doing a Put request against the application resource. with the if/match header set to the ETag. You then need to acknowledge the event this will generate and once that is done your UCWA session will be ready to go, you then just need to query the communication resource to get the links required to access the ConversationLogs from the server. In the sample app I'm only accessing the last 50 items from the server as this is only a POC anyway. When it comes to access the conversation transcripts this requires a Batch request to make it efficient (the max batch size in SK4B in 100) so using a page size of 50 keeps this all working okay. A brief overview of the requests required to access the Conversation history.
- 1 Get request to get the Conversation Logs which is a list with a link to each of the Conversation Entries
- Batch Get Request for each of the Conversation Entries which gives back a detail history of each conversation (minus the actual Transcript of the conversation but you do get limited Message preview).
- If you want the full conversation transcript you use the link from the conversation history to access the Transcript. (in the sample when you click the transcript Cell in the Table it makes this request to the SK4B server to get the Transcript and presents that in a separate Div on the
page ),
Installing and using this Tab Application
Like any Teams Tab application it must be hosted somewhere, I'm hosting it out of my GitHub site so the configuration file located in https://github.com/gscales/gscales.github.io/blob/master/TeamsUCWA/app/Config/appconfig.js has the following configuration to ensure it point to the hosted location
const getConfig = () => { var config = { clientId : "eed5c282-249f-46f3-9e18-bde1d0091716", redirectUri : "/TeamsUCWA/app/silent-end.html", authwindow : "/TeamsUCWA/app/auth.html", hostRoot: "https://gscales.github.io", }; return config; }
Also the manifest file https://github.com/gscales/gscales.github.io/blob/master/TeamsUCWA/TabPackage/manifest.json has setting that point to hosted that need to be changed if its hosted elsewhere (just search and replace gscales.github.io)
Application Registration
To use the UCWA API you need to create an application registration with the following oAuth grants
the applicationId for this registration should then be used to replace the clientid in the appconfig.js . The application registration should use the silent-end.html page as the redirect for authentication. Then the last thing you need to do is make sure that the ApplicationId has been consented to in your Organization eg
Application Registration
To use the UCWA API you need to create an application registration with the following oAuth grants
the applicationId for this registration should then be used to replace the clientid in the appconfig.js . The application registration should use the silent-end.html page as the redirect for authentication. Then the last thing you need to do is make sure that the ApplicationId has been consented to in your Organization eg
https://login.microsoftonline.com/common/adminconsent?client_id=08401c36-6179-4bbe-9bcc-d34ff51d828f
Side Loading - To use custom tab applications you first need to enable side loading of Apps in the Office365 Admin portal ref .The important part is "Sideloading is how you add an app to Teams by uploading a zip file directly to a team. Sideloading lets you test an app as it's being developed. It also lets you build an app for internal use only and share it with your team without submitting it to the Teams app catalog in the Office Store. "
As this is a custom application you need to use the "upload a custom app" link which is available when you click ManageTeam-Apps tab see
(Note if you don't see the "upload a custom app" check that you have side loading of apps enabled in your tenant config)
What you upload here is a Zip file containing your manifest file and two images that you manifest refers to for eg
{
"icons": {
"outline": "Outline32.png",
"color": "Colour192.png"
},
For this sample this is located in https://github.com/gscales/gscales.github.io/blob/master/TeamsUCWA/TabPackage/manifest.json
{
"icons": {
"outline": "Outline32.png",
"color": "Colour192.png"
},
For this sample this is located in https://github.com/gscales/gscales.github.io/blob/master/TeamsUCWA/TabPackage/manifest.json
All the code for this post is located in GitHub https://github.com/gscales/gscales.github.io/tree/master/TeamsUCWA
Need help with anything I've talked about in this post or need somebody to write C#,JS, NodeJS, Azure or Lambda functions or PowerShell scripts then I'm available now for freelance/contract or fulltime work so drop me an Email at gscales@msgdevelop.com