From 4b5ab521660b73e7de0baf95c208acea847b44da Mon Sep 17 00:00:00 2001 From: adilei Date: Sun, 12 May 2024 15:06:33 +0300 Subject: [PATCH 1/4] Added a sample demonstrating 3rd party authentication with OKTA --- 3rdPartySSOWithOKTA/README.md | 78 ++++++++ 3rdPartySSOWithOKTA/img/placeholder.png | Bin 0 -> 72681 bytes 3rdPartySSOWithOKTA/public/index.html | 249 ++++++++++++++++++++++++ 3rdPartySSOWithOKTA/public/signout.html | 10 + README.md | 46 ++--- 5 files changed, 361 insertions(+), 22 deletions(-) create mode 100644 3rdPartySSOWithOKTA/README.md create mode 100644 3rdPartySSOWithOKTA/img/placeholder.png create mode 100644 3rdPartySSOWithOKTA/public/index.html create mode 100644 3rdPartySSOWithOKTA/public/signout.html diff --git a/3rdPartySSOWithOKTA/README.md b/3rdPartySSOWithOKTA/README.md new file mode 100644 index 00000000..dd891eb1 --- /dev/null +++ b/3rdPartySSOWithOKTA/README.md @@ -0,0 +1,78 @@ +# 3rd Party SSO with OKTA + +This custom canvas demonstates how an access token obtained from a 3rd party identity provider, like OKTA, can be used in the context of a Copilot Studio sign-in flow. + +## Getting started + +To run this sample, including the end-to-end SSO flow with OKTA, you will need to: + +1. Deploy [index.html](./public/index.html) and [signout.html](./public/signout.html) on a remote or local server +2. Create an OKTA developer account, or use an existing one +3. Create a new application in OKTA +4. Configure the default access policy in the OTKA authorization server +5. Retrieve the token endpoint for a custom copilot that is configured with manual authentication +6. Update configuration values in index.html + +## Detailed instructions + +### Deploy the sample files + +Deploy [index.html](./public/index.html) and [signout.html](./public/signout.html) on a local or a remote server, so they are availabe via two URLs. For example: [http://localhost:8080/index.html](http://localhost:8080/index.html) and [http://localhost:8080/signout.html](http://localhost:8080/signout.html) + +### Configure OKTA + +1. Sign up for an [OKTA developer account](https://developer.okta.com/signup/) +2. Sign in to the OKTA admin dashboard at **https://{your domain}-admin.okta.com/** and create a new application with the following details. + + +| Application Property | Value | +| ---------------------- | ------------------------------------------------------------------- | +| Sign-in method | OIDC - OpenID Connect | +| Application type | Single-Page Application | +| Grant type | Authorization Code, Interaction Code | +| Sign-in redirect URIs | the URL to index.html | +| Sign-out redirect URIs | the URL to signout.html | +| Trusted origins | your base URL, for example http://localhost:8080 | +| Assignments | allow access to specific users or groups based on your requirements | + +3. After creating the application, note down its Client ID +4. **Index.html** uses the OKTA sign-in widget which relies on the Interaction Code sign-in flow. To enable the Interaction Code flow: + + 1. Navigate to the API settings page in **https://{your domain}.okta.com/admin/oauth2/as** + 2. Under Authorization Servers, edit the default authorization server + 3. Under Access Policies, edit the default policy rule + 4. Under "IF Grant type is" -> Other grants, click on **Interaction Code**. + 5. Update the rule + + +### Configure manual authentication and obtain the token endpoint + +1. This SSO pattern will work for copilots configured with manual authentication and any OAuth authentication provider, but will even work when no values are provided for an authentication provider. To configure manual authentication without providing any real values, select "Azure Active Directory v2" and enter **placeholder** for both client ID and secret + +> [!IMPORTANT] +> After making any changes to the copilot's authentication settings, publish the copilot. + +

+ Manual authentication without real values +
+ Manual authentication without real values +

+ + +2. Obtain the copilot's token endpoint from Settings -> Channels -> Mobile App + +### Populate configuration values in index.html + +1. Populate the following values in index.html, based on your configuration + +| Variable | Value | +| --------------------- | ----------------------------------------------------------------------------------------- | +| baseUrl | your OKTA domain, for example: https://mydomain.okta.com/ | +| clientID | The Client ID of the OKTA application | +| redirectUri | the URL for index.html, for example: http://localhost:8080/src/index.html | +| issuer | {your OKTA domain}/oauth2/default, for example: https://mydomain.okta.com//oauth2/default | +| tokenEndpoint | Your copilot's token endpoint | +| postLogoutRedirectUri | he URL for signout.html, for example: http://localhost:8080/src/signout.html | + +2. Publish or save index.html, depending if it is deployed locally or remotely + diff --git a/3rdPartySSOWithOKTA/img/placeholder.png b/3rdPartySSOWithOKTA/img/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1e79088006c7959cd36b7690c796ef917430f8 GIT binary patch literal 72681 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πyAmnwnOl71vC4_@R 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 literal 0 HcmV?d00001 diff --git a/3rdPartySSOWithOKTA/public/index.html b/3rdPartySSOWithOKTA/public/index.html new file mode 100644 index 00000000..fa78f393 --- /dev/null +++ b/3rdPartySSOWithOKTA/public/index.html @@ -0,0 +1,249 @@ + + + + + Copilot Studio 3P SSO Demo + + + + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/3rdPartySSOWithOKTA/public/signout.html b/3rdPartySSOWithOKTA/public/signout.html new file mode 100644 index 00000000..30811f3d --- /dev/null +++ b/3rdPartySSOWithOKTA/public/signout.html @@ -0,0 +1,10 @@ + + + + User Signed Out + + +

User Signed Out

+

The user has been successfully signed out.

+ + \ No newline at end of file diff --git a/README.md b/README.md index 245737b5..d785cf45 100644 --- a/README.md +++ b/README.md @@ -22,28 +22,30 @@ This repository contains samples and artifacts for Microsoft Copilot Studio. | Sample Name | Description | View | | --- | --- | --- | -| BotConnectorApp | Demonstrates how to connect your bot to a custom app for example mobile-device app | [View][cs#1]| -| BuildYourOwnCanvasSamples | Demonstrates how to connect your bot to a custom canvas with various functionality | [View][cs#2] | -| ConnectToEngagementHub | Demonstrates how to detect a handoff activity during a bot conversation and read conversation context | [View][cs#3] | -| CustomAnalytics | This solution allows customers to create a custom Power BI dashboard on top of their copilots analytics data | [View][cs#4] | -| HumanVerificationSample | Identify if the user on the other side is a human or a bot by sending an email to the user with a verification code | [View][cs#5] | -| ImplementationGuide | The implementation guide document provides a framework to do a 360-degree review of a Copilot Studio project. Through probing questions, it highlights potential risks and gaps, aims at aligning the project with the product roadmap, and shares guidance, best practices and reference architecture examples | [View][cs#6] | -| MultilingualBotSample | Sample implementation of a middleware translation relay bot to do real-time translations using Azure services | [View][cs#7] | -| RelayBotSample | Demonstrates how to connect your bot to existing Azure Bot Service channels | [View][cs#8] | -| SharePointSSOComponent | A Sharepoint component demonstrating how copilots can be deployed to SharePoint sites with SSO enabled | [View][cs#9] | -| TestFramework | Run tests against a bot using Direct Line channel and validate that the bot works as expected | [View][cs#10] | - - -[cs#1]:./BotConnectorApp -[cs#2]:./BuildYourOwnCanvasSamples -[cs#3]:./ConnectToEngagementHub -[cs#4]:./CustomAnalytics -[cs#5]:./HumanVerificationSample -[cs#6]:./ImplementationGuide -[cs#7]:./MultilingualBotSample -[cs#8]:./RelayBotSample -[cs#9]:./SharePointSSOComponent -[cs#10]:./PVATestFramework +| 3rdPartySSOWithOKTA | Demonstrates how to implement a seamless SSO experience with a 3rd party authentication provider | [View][cs#1]| +| BotConnectorApp | Demonstrates how to connect your bot to a custom app for example mobile-device app | [View][cs#2]| +| BuildYourOwnCanvasSamples | Demonstrates how to connect your bot to a custom canvas with various functionality | [View][cs#3] | +| ConnectToEngagementHub | Demonstrates how to detect a handoff activity during a bot conversation and read conversation context | [View][cs#4] | +| CustomAnalytics | This solution allows customers to create a custom Power BI dashboard on top of their copilots analytics data | [View][cs#5] | +| HumanVerificationSample | Identify if the user on the other side is a human or a bot by sending an email to the user with a verification code | [View][cs#6] | +| ImplementationGuide | The implementation guide document provides a framework to do a 360-degree review of a Copilot Studio project. Through probing questions, it highlights potential risks and gaps, aims at aligning the project with the product roadmap, and shares guidance, best practices and reference architecture examples | [View][cs#7] | +| MultilingualBotSample | Sample implementation of a middleware translation relay bot to do real-time translations using Azure services | [View][cs#8] | +| RelayBotSample | Demonstrates how to connect your bot to existing Azure Bot Service channels | [View][cs#9] | +| SharePointSSOComponent | A Sharepoint component demonstrating how copilots can be deployed to SharePoint sites with SSO enabled | [View][cs#10] | +| TestFramework | Run tests against a bot using Direct Line channel and validate that the bot works as expected | [View][cs#11] | + + +[cs#1]:./3rdPartySSOWithOKTA +[cs#2]:./BotConnectorApp +[cs#3]:./BuildYourOwnCanvasSamples +[cs#4]:./ConnectToEngagementHub +[cs#5]:./CustomAnalytics +[cs#6]:./HumanVerificationSample +[cs#7]:./ImplementationGuide +[cs#8]:./MultilingualBotSample +[cs#9]:./RelayBotSample +[cs#10]:./SharePointSSOComponent +[cs#11]:./PVATestFramework ## Contributing From 7827686daf5f84731cc7dd079133c82553d8440c Mon Sep 17 00:00:00 2001 From: adilei Date: Sun, 19 May 2024 18:04:52 +0300 Subject: [PATCH 2/4] Typos, added steps to README, cleaning up code --- 3rdPartySSOWithOKTA/README.md | 13 +++++---- 3rdPartySSOWithOKTA/public/index.html | 42 +++++++++++++++++---------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/3rdPartySSOWithOKTA/README.md b/3rdPartySSOWithOKTA/README.md index dd891eb1..1b259bf7 100644 --- a/3rdPartySSOWithOKTA/README.md +++ b/3rdPartySSOWithOKTA/README.md @@ -8,7 +8,7 @@ To run this sample, including the end-to-end SSO flow with OKTA, you will need t 1. Deploy [index.html](./public/index.html) and [signout.html](./public/signout.html) on a remote or local server 2. Create an OKTA developer account, or use an existing one -3. Create a new application in OKTA +3. Create a new app integration in OKTA 4. Configure the default access policy in the OTKA authorization server 5. Retrieve the token endpoint for a custom copilot that is configured with manual authentication 6. Update configuration values in index.html @@ -22,7 +22,7 @@ Deploy [index.html](./public/index.html) and [signout.html](./public/signout.htm ### Configure OKTA 1. Sign up for an [OKTA developer account](https://developer.okta.com/signup/) -2. Sign in to the OKTA admin dashboard at **https://{your domain}-admin.okta.com/** and create a new application with the following details. +2. Sign in to the OKTA admin dashboard at **https://{your domain}-admin.okta.com/** and create a new app integration with the following details. | Application Property | Value | @@ -35,14 +35,17 @@ Deploy [index.html](./public/index.html) and [signout.html](./public/signout.htm | Trusted origins | your base URL, for example http://localhost:8080 | | Assignments | allow access to specific users or groups based on your requirements | -3. After creating the application, note down its Client ID -4. **Index.html** uses the OKTA sign-in widget which relies on the Interaction Code sign-in flow. To enable the Interaction Code flow: +1. After creating the app integration, note its Client ID +2. **Index.html** uses the OKTA sign-in widget which relies on the Interaction Code sign-in flow. To enable the Interaction Code flow: 1. Navigate to the API settings page in **https://{your domain}.okta.com/admin/oauth2/as** 2. Under Authorization Servers, edit the default authorization server 3. Under Access Policies, edit the default policy rule 4. Under "IF Grant type is" -> Other grants, click on **Interaction Code**. 5. Update the rule + 6. + +3. You should also make shoure that CORS has been enabled for your base URL. In the OKTA admin center, navigate to Security -> API -> Trusted Origins. You base url (e.g. http://localhost:8080) should appear under "Trusted Origins" with CORS enabled. In case your base url is missing, add the url with CORS enabled. ### Configure manual authentication and obtain the token endpoint @@ -70,7 +73,7 @@ Deploy [index.html](./public/index.html) and [signout.html](./public/signout.htm | baseUrl | your OKTA domain, for example: https://mydomain.okta.com/ | | clientID | The Client ID of the OKTA application | | redirectUri | the URL for index.html, for example: http://localhost:8080/src/index.html | -| issuer | {your OKTA domain}/oauth2/default, for example: https://mydomain.okta.com//oauth2/default | +| issuer | {your OKTA domain}/oauth2/default, for example: https://mydomain.okta.com/oauth2/default | | tokenEndpoint | Your copilot's token endpoint | | postLogoutRedirectUri | he URL for signout.html, for example: http://localhost:8080/src/signout.html | diff --git a/3rdPartySSOWithOKTA/public/index.html b/3rdPartySSOWithOKTA/public/index.html index fa78f393..052eb905 100644 --- a/3rdPartySSOWithOKTA/public/index.html +++ b/3rdPartySSOWithOKTA/public/index.html @@ -2,7 +2,7 @@ - Copilot Studio 3P SSO Demo + Copilot Studio SSO with OKTA @@ -60,10 +60,22 @@ #sign-out-button { font-size: 16px; border: none; - /* Change this to your preferred color */ color: black; cursor: pointer; visibility: hidden; + position: fixed; + top: 5px; + right: 10px; + /* Add the following lines */ + display: inline-block; + width: auto; + padding: 10px 20px; + /* Adjust as needed */ + border-radius: 5px; + } + + #chatwindow { + visibility: hidden; } @@ -72,7 +84,7 @@
-