汎用 OAuth プロバイダーでシングル サインオンを構成する
Copilot Studio は、OAuth 2.0 互換の認証プロバイダーによるシングル サインオン (SSO) をサポートします。 SSOを使用すると、Webサイトのエージェントは、エージェントがデプロイされているページまたはアプリにログインしたカスタマーをサインインさせることができます。
前提条件
汎用 OAuth プロバイダーの SSO フローをサポートするカスタム キャンバスを作成または使用する
一般的な OAuth 2.0 プロバイダーに接続されたエージェントで認証トピックがトリガーされると、Copilot Studio はユーザーのアクセス トークンをポストするために使用されるセキュアな URL を含むメッセージを送信します。
カスタム キャンバスまたはキャンバスが埋め込まれているページでは、次のパターンを実装する必要があります:
好みの方法を使用して、OAuth 2.0 認証プロバイダーからサインインしたユーザーのアクセス トークンを取得します。
Copilot Studio からの受信メッセージを傍受し、安全な URL を抽出します。
アクセス トークン をセキュアな URL にポストします。
セキュアな URL を抽出し、トークンをポストします
カスタム キャンバスは、Copilot Studio からのメッセージを受信するコンテキストで実行されるコードであるミドルウェアの概念を使用して、受信メッセージをインターセプトします。
サインイン要求に応答するには、カスタムキャンバスでコンテンツ タイプ application/vnd.microsoft.card.oauth
の添付ファイル付きメッセージをインターセプトする必要があります。 OAuthCard の添付ファイルには、content.tokenPostResource.sasUrl
プロパティから安全な URL を抽出できます。 最後に、カスタム キャンバスはユーザーの アクセス トークン をセキュリティで保護された URL にポストする必要があります。
次の JavaScript コードは、セキュアな URL を抽出してトークンをポストするミドルウェアのコードの例です。 ポストが成功した場合、ミドルウェアは false
を返します。 ポストが失敗した場合、またはアクティビティが application/vnd.microsoft.card.oauth
プロパティを持っていない場合は、next(…args)
を返します。
const activityMiddleware = () => next => (...args) => {
if (args[0].activity.attachments?.[0]?.contentType === 'application/vnd.microsoft.card.oauth') {
var postEndpoint = args[0].activity.attachments?.[0].content.tokenPostResource.sasUrl;
// Perform an HTTP POST to the secure URL with the body of:
// {
// "token": <user_token>
// }
if(success)
return false;
else
return next(...args);
} else {
return next(...args);
}
};
完全なサンプル コード
サインインしたユーザーのトークンを取得し、トークンを Copilot Studio にポストするカスタム キャンバスまたはアプリの実装は、認証プロバイダによって異なります。 サインイン フローとアクセス トークンの取得の詳細については、認証プロバイダーのドキュメントを参照してください。 OKTA を使用した参照サンプルについては、OKTA を使用したサードパーティの SSOを参照してください。
Copilot Studio でのトークンの使用
セキュアな URL を使ってポストされたトークンは、Copilot Studio の System.User.AccessToken
変数に入力されます。 エージェント作成者は、このシステム変数を使用して、トークンを生成した認証済みプロバイダーに接続されている保護された API にアクセスできます。
次の例では、System.User.AccessToken
を使用する Authorization ヘッダーで HTTP 呼び出しが構成されています。
サポート対象のチャネル
汎用 OAuth 認証プロバイダーを使用した SSO はカスタムパターンで、カスタム キャンバスまたは Directline API を使用するその他のクライアントで実装できます。