基本設定

Oracle Webチャネル設定の基本ステップを次に示します。

必要なもの

  • Oracle Webチャネル。チャネルを作成すると、チャット・アプリケーションの初期化に必要なチャネルIDと秘密キーが生成されます。
  • Oracle Chat ServerのURL。
  • Oracle Technology NetworkのODAおよびOMCのダウンロード・ページから取得できるOracle Web SDK (Oracle Native Client SDKs for OCI Native Environmentsにあります)。このZIPをダウンロードしてローカル・システムに抽出します。このZIPには、SDKのクラスを説明するユーザー・ガイドと、その多くの機能をデモで示すサンプル・アプリケーションが含まれます。

Oracle Webチャネルの構成

認証(チャネルへのアクセスを保護する)または未認証の2つのモードで、ODA音声、テキストまたはアタッチメント・サーバーに接続するようにチャネルを構成できます。
  • 認証は、JSON Web Token (JWT)を使用して強制されます。顧客のバックエンド・サーバーによってJWTトークンが生成され、その後Oracle Web SDKに渡されます。このトークンは、ODA音声、テキストまたはアタッチメント・サーバーへの各リクエストに使用されます。
    ノート

    チャネルへのアクセスを保護するには、トークンは常にリモート・サーバーで生成される必要があります。クライアント・ブラウザ内で生成されないようにしてください。
    WebアプリケーションではODAサーバーに接続する必要がある場合、まずバックエンド・サーバーからのトークンをリクエストし、次にそれを認可ヘッダーに追加します。ODAサーバーによってトークンが検証され、要求が評価された後、ソケットがオープンされるか、接続が拒否されます。

    ヒント:

    この記事では、認証済チャネルを使用してSDKを実行するステップを示します。
  • 未認証モード – 未認証モードを使用するのは、クライアントが署名付きJWTトークンを生成できない場合、認証メカニズムが存在しない場合、またはクライアント・ウィジェットがすでに保護されていて認証済ユーザーから参照可能な場合です。
Oracle Webチャネルを構成するには:
  1. メニューから「開発」「チャネル」を選択します。
  2. 「ユーザー」を選択します。
  3. 「チャネルの追加」をクリックし、チャネル・タイプとして「Oracle Web」をクリックします。
  4. ダイアログを完成させます:
    • チャネル名を入力してください
    • 認証済接続の場合:
      • 「クライアント認証の有効化」トグルをオンに切り替えて、SDKがクライアント認証対応チャネルに接続しているかどうかを確認します。
      • チャネルは、カンマ区切りリストとして追加するドメインのサイトとのみ通信します。たとえば、*.corp.example.com, *.hdr.example.comです。アスタリスク(*)を1つ入力すると、任意のドメインからチャネルに無制限にアクセスできます。通常、開発時にアスタリスクを1つだけ入力します。本番では、ドメインの許可リストを追加します。
      • 「最大トークン有効期限(分)」で、JWTトークンの最大時間を設定します。
    • 未認証接続の場合:
      • 「クライアント認証の有効化」トグルをオフに切り替えます。
      • チャネルにアクセスできるドメインのカンマ区切りリストを入力します。この許可リスト内のドメインにアスタリスクが含まれている場合(*.hdr.example.com)、または許可リストが完全にはわからない場合は、認証された接続を検討できます。
    • セッションの有効期間を設定します。
    • 「作成」をクリックします。Oracle Digital Assistantによって、SDKの初期化に必要なチャネルIDと秘密キーが生成されます。これらは、チャット・ウィジェットをホストするようにHTMLページを構成する際に必要になるため、手近な場所に保持しておきます。
  5. チャネルをスキルまたはデジタル・アシスタントにルーティングします。
  6. 「チャネル有効」を「オン」に切り替えます。

チュートリアル: Oracle Web SDKチャットの保護

このチュートリアル: Oracle Web SDKチャットの保護を通じて、Webチャット・ウィジェットの保護を実際に体験することができます。

SDKのインストール

  1. ダウンロードしたOracle Web SDKの抽出済ZIPファイルで、(native-client-sdk-jsディレクトリにある) web-sdk.jsファイルを探します。
  2. (抽出済ZIPのnative-client-sdk-jsディレクトリにある) web-sdk.jsをプロジェクト・ディレクトリに保存します。<script>タグのコードに<WebSDK URL>プロパティを定義する際に必要になるため、ファイルの場所をメモしておきます。
  3. SDKを初期化する次の関数を使用して、JavaScriptファイルを作成します。このファイルは、SDKに付属するサンプルでsettings.jsと呼びます。
    //settings.js
    var chatSettings = {
        URI: '<Server URI>',
        channelId: '<Channel ID>',
        userId: '<User ID>'
    };
    
    function initSDK(name) {
        // If WebSDK is not available, reattempt later
        if (!document || !WebSDK) {
            setTimeout(function() {
                initSDK(name);
            }, 2000);
            return;
        }
    
        // Default name is Bots
        if (!name) {
            name = 'Bots';
        }
    
        setTimeout(function() {
            var Bots = new WebSDK(chatSettings);    // Initiate library with configuration
    
            var isFirstConnection = true;
            Bots.on(WebSDK.EVENT.WIDGET_OPENED, function() {
                if (isFirstConnection) {
                    Bots.connect()                          // Connect to server
                        .then(function() {
                            console.log('Connection Successful');
                        })
                        .catch(function(reason) {
                            console.log('Connection failed');
                            console.log(reason);
                        });
                       isFirstConnection = false;
                }
            });
    
            window[name] = Bots;
        }, 0);
    }
  4. 次のプロパティを定義します:
    • URI - Oracle Digital AssistantインスタンスURLのホスト名。ここで渡す必要があるのは、最初のパス(/)のみです。このURLは、プロトコル(https://)の有無にかかわらず渡すことができます。
    • channelId - Oracle Webチャネルの作成時に生成されるチャネルID。基礎となるスキルにウィジェットを接続するため、このプロパティは必須です。
    • userId - ユーザーID。この値を指定すると、このスキルのユーザー・ベースをインサイトの一意のユーザー・メトリックで追跡できます。ユーザーIDを指定せず、SDKによって新しいセッションごとにIDが生成されます。このプロパティは、未認証接続ではオプションです。
  5. HTMLページで、JSファイル(次の例ではsetting.js)のweb-sdk.jsライブラリとWeb SDKネームスペース(通常はBots)の両方の場所を参照します。このネームスペースを使用してパブリックAPIを起動します。たとえば、ネームスペースをBotsに設定した場合、Bots.<API>()としてAPIを起動します。様々な機能およびイベントの詳細は、Oracle Web SDKのZIPファイルに含まれているユーザー・ガイド(readmeとHTMLドキュメントの両方で利用可能)を参照してください。
       <script src="scripts/settings.js"></script>
       <script src="scripts/web-sdk.js" onload="initSdk('Bots')"></script>    

非同期モジュール定義APIを使用したライブラリのインポート

RequireJS (Oracle JETを含む)やSystemJSなどの非同期モジュール定義(AMD) APIの実装を使用して、ライブラリをインポートできます。
requirejs(['<path of the web-sdk>'], function(WebSDK) {
var settings = {
    URI: '<Server URI>',
    channelId: '<Channel ID>',
    userId: '<User ID>'
};
Bots = new WebSDK(settings);

Bots.connect();
});

JavaScriptを使用したライブラリの動的インポート

次のMozilla Development Network (MDN)ベースのユーティリティ関数を使用して、JavaScriptでライブラリを動的にインポートします。
function fetchSDK(src, onloadFunction, name) {
var script = document.createElement('script');
script.type = 'application/javascript';
script.async = true;    // load the script asynchronously
script.defer = true;    // fallback support for browsers that does not support async
script.onload = function() {
    onloadFunction(name);
};
document.head.appendChild(script);
script.src = src;
}

fetchSDK('<path of the web-sdk>', initSDK, '<WebSDK namespace>');

クライアント認証の構成

クライアント認証は、許可されたドメインのリストの使用に加えて、署名付きJWTトークンによって実施されます。

トークンの生成および署名は、バックエンド・サーバーでクライアントによって行われる必要があります(ユーザー/クライアント認証の後が望ましい)。こうすることで、keyIdkeySecretの安全性が維持されます。

SDKがODAサーバーとの接続を確立する必要があるとき、JWTトークンを最初にクライアントにリクエストし、その後、JWTトークンを接続リクエストとともに送信します。ODAサーバーはトークン署名を検証し、JWTペイロードから要求セットを取得して、接続を確立するためのトークンを確認します。

このモードを有効にするには、SDKの初期化時に次の2つのフィールドが必要です。SDK設定パラメータにclientAuthEnabled: trueを渡し、トークン・ジェネレータ関数を2つ目のパラメータとして渡す必要があります。この関数は、署名済JWTトークン文字列を返すように解決されるPromiseを返す必要があります。
//settings.js
var chatSettings = {
    URI: '<Server URI>',
    clientAuthEnabled: true
};

function generateToken() {
    return new Promise(function(resolve) {
        fetch('https://yourbackend.com/endpointToGenerateJWTToken')
            .then(function(token) {
               resolve(token);
            })
            .catch(function(error) {
                console.log('Token generation error:', error);
            });
    });
}

function initSDK(name) {
    // If WebSDK is not available, reattempt later
    if (!document || !WebSDK) {
        setTimeout(function() {
            initSDK(name);
        }, 2000);
        return;
    }

    // Default name is Bots
    if (!name) {
        name = 'Bots';
    }

    setTimeout(function() {
        var Bots = new WebSDK(chatSettings, generateToken);    // Initiate library with configuration

        var isFirstConnection = true;
        Bots.on(WebSDK.EVENT.WIDGET_OPENED, function() {
            if (isFirstConnection) {
                Bots.connect()                          // Connect to server
                    .then(function() {
                        console.log('Connection Successful');
                    })
                    .catch(function(reason) {
                        console.log('Connection failed');
                        console.log(reason);
                    });
                   isFirstConnection = false;
            }
        });

        window[name] = Bots;
    }, 0);
}

JWTトークン

クライアント・アプリケーションがJWTトークンを生成します。一部のトークン・ペイロード・フィールドは必須であり、ODAサーバーによって検証されます。クライアントは、HS256署名アルゴリズムを使用してトークンに署名する必要があります。トークンの本文には、次の要求が必要です:
  • iat - 発行時刻
  • exp - 有効期限
  • channelId - チャネルID。
  • userId - ユーザーID
トークン自体は、接続先のクライアント認証対応チャネルの秘密キーによって署名される必要があります。署名済JWTトークンの例を次に示します:
エンコード済:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NzY3NDcyMDUsImV4cCI6MTU3Njc1MTExNywiY2hhbm5lbElkIjoiNDkyMDU5NWMtZWM3OS00NjE3LWFmOWYtNTk1MGQ2MDNmOGJiIiwidXNlcklkIjoiSm9obiIsImp0aSI6ImQzMjFjZDA2LTNhYTYtNGZlZS05NTBlLTYzZGNiNGVjODJhZCJ9.lwomlrI6XYR4nPQk0cIvyU_YMf4gYvfVpUiBjYihbUQ
デコード済:
  • ヘッダー:
    {
        "typ": "JWT",
        "alg": "HS256"
    }
  • ペイロード:
    {
        "iat": 1576747205,
        "exp": 1576748406,
        "channelId": "4920595c-ec79-4617-af9f-5950d603f8bb",
        "userId": "John"
    }
トークンのいずれかの要求が欠落している場合、またはその値のフォーマットが正しくない場合は、原因を説明するエラー・メッセージがSDKによってスローされます。接続は試行されません。エラー・メッセージを使用してJWTトークンの問題を修正できます。ペイロードで渡されるその他の要求は、クライアント認証メカニズムには影響しません。