Yellowfinのクライアント組織に属している人向けのJSAPIv3でのダッシュボード表示


概要

件名の通りなのですが、CORS設定を行いwebserver越しにRESTでYellowfinサーバーにアクセスするで試してみたとおり、デフォルト組織に属するユーザーに関しては問題なく表示できるのですが、人によってクライアント組織を分けていて、その人に向けて表示する内容を変えたいといった場合に使える方法を検証した結果、無事に表示できたのでそのメモを残そうと思います。

前提

・管理者ユーザーとアクセスユーザーが存在する。この場合管理者ユーザー([email protected])、アクセスユーザー([email protected])。
・アクセスユーザーはtest1というクライアント組織に属している(参照IDもつける)。
・今回の場合はSSOを有効にしているため、リポジトリに対してSQLを発行済です。

サンプルコード

解説としては、body変数のアクセスユーザーの情報にclientOrgRefを付与することと、JSAPIv3を使用してダッシュボードを表示する際のURLにclientOrgクエリを追加することです。

dashboradClientRef.js
<html>
<head>
    <meta charset="utf-8" />
    <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
</head>
<body>
    <div id="reportDiv"></div>
    <script>
        var authUserId = '[email protected]';
        var authUserPass = 'dammy';
        var adminId = '[email protected]';
        var adminPassword = 'test';
        var body = {
            signOnUser: {
                userName: authUserId,
                password: authUserPass,
                clientOrgRef: 'test1'
            },
            noPassword: true,
            adminUser: {
                userName: adminId,
                password: adminPassword
            }
        };
        //encode to JSON
        var json_text = JSON.stringify(body);
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://localhost:8940/api/rpc/login-tokens/create-sso-token');
        xhr.responseType = 'json';
        xhr.onload = () => {
            var securityToken = xhr.response.securityToken;
            //alert(securityToken);
            let url = 'http://localhost:8940/JsAPI/v3?token=' + securityToken + '&clientOrg=test1';
            let tp = 'text/javascript';
            let sc = document.createElement('script');
            sc.src = url;
            sc.type = tp;
            document.body.appendChild(sc);
            setTimeout(function () {
                yellowfin.showLoginPrompt = false;
                yellowfin.init().then(() => {
                    yellowfin.loadDashboard({
                        dashboardUUID: 'e7409ff2-f846-44e1-a603-b78ec51b20b9',
                        element: document.querySelector('div#reportDiv')
                    });
                });
            }, 1000);
        };
        xhr.setRequestHeader('Authorization', 'YELLOWFIN ts=' + new Date().getTime() + ', nonce=123');
        xhr.setRequestHeader('Accept', 'application/vnd.yellowfin.api-v1+json');
        xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
        xhr.send(json_text);
    </script>
</body>
</html>

かんそう

これで、埋め込み表示でも人によってクライアント組織別でデータが違うダッシュボードも表示できるようになりますね。その前のシステムで情報は揃える必要がありますが・・・。それでもアクセスフィルターで分けているような場合だと有効なんじゃないかなと思います。