6.10.1. Web アプリケーション

JavaScript を使った OpenID Connect 認証方法を記載します。

大きく分けて、以下の3つの処理を実装します。

  • OpenID Connect 認証開始 REST API の実行
  • OpenID Connect 認証完了時の処理
  • BaaS サーバへのログイン

OpenID Connect 認証開始

OpenID Connect 認証開始の REST API を実行します。 リクエストパラメータに、ランディングページの URL を指定します。

REST API の URI は、以下のとおりです。

{endpointUri}/1/{tenantId}/auth/oidc/start?op={op}&redirect={redirectUri}&scope={scope}&createUser={true|false}&sessionToken={sessionToken}
  • op、redirectUri は必須です。
  • op は連携する OpenID Connectプロバイダを指定します。設定可能な値は以下の通りです。
    • google: Google
    • adfs: ADFS (Windows Server 2016)
    • other: OpenAM
  • OIDC認証ユーザを作成する場合は、createUser=true を指定してください。
  • 作成済ユーザとのアカウントリンク設定をする場合は、sessionToken にリンクさせたいユーザのセッショントークンを指定してください。
  • scope はオプションです。取得したい属性情報(OpenID Connectスコープ)を指定します。必ず "openid" が含まれている必要があります。

redirectUri, scope については、いずれもURIエンコードが必要な点に注意してください。

以下にサンプルコードを示します。

例: index.html

<script>

function convertAbsUrl(src) {
    return $("<a>").attr("href", src).get(0).href;
}

// op が Google の場合
function startOidcToGoogle() {
    var redirectUri = convertAbsUrl("./landing.html");

    // REST API 実行 (ページ移動)
    var startUri = <EndpointUri> + "/1/" + <tenantId> + "/auth/oidc/start?op=google&redirect=" + encodeURIComponent(redirectUri) + "&createUser=true";
    document.location.href = startUri;
};

// op が ADFS, scope を指定する場合
function startOidcToAdfs() {
    var redirectUri = convertAbsUrl("./landing.html");
    var startUri = <EndpointUri> + "/1/" + <tenantId> +  "/auth/oidc/start?op=adfs&redirect=" + encodeURIComponent(redirectUri) + "&scope=" + encodeURIComponent("openid profile email") + "&createUser=true";
    document.location.href = startUri;
};

// op が Other(OpenAM) の場合
function startOidcToOther() {
    var redirectUri = convertAbsUrl("./landing.html");

    // REST API 実行 (ページ移動)
    var startUri = <EndpointUri> + "/1/" + <tenantId> + "/auth/oidc/start?op=other&redirect=" + encodeURIComponent(redirectUri) + "&createUser=true";
    document.location.href = startUri;
};

</script>

<a href="#" onclick="startOidcToGoogle();">Start authentication (Google)</a>
<br>
<a href="#" onclick="startOidcToAdfs();">Start authentication (ADFS)</a>
<br>
<a href="#" onclick="startOidcToOther();">Start authentication (Other)</a>

OpenID Connect 認証完了時の処理

OpenID Connect 認証が完了すると、指定したリダイレクト URI (ランディングページ)にリダイレクトされます。 リダイレクト URI は以下のようにワンタイムトークンがクエリパラメータに格納された形になります。

ランディングページ(例: landing.html) はあらかじめ用意しておきます。

リダイレクト URI からワンタイムトークンを取り出します。 以下にサンプルコードを示します。

例: landing.html

<script>

$(function() {
    // クエリパラメータからワンタイムトークンを取得
    var getOneTimeToken = function() {
        var query = document.location.search.substring(1);
        var params = query.split('&');
        for (var i = 0; i < params.length; i++) {
            var el = params[i].split('=');
            var name = decodeURIComponent(el[0]);
            if (name === "token") {
                return decodeURIComponent(el[1]);
            }
        }
        return null;
    };

    var oneTimeToken = getOneTimeToken();

    // BaaS サーバへのログイン実装(下記参照)
    ・・・
});

</script>

BaaS サーバへのログイン

JavaScript SDK のログイン API を使い、ワンタイムトークンを指定してログインします。

サーバからセッショントークンが払いだされ、以降は本セッショントークンで認証が行われます。 以下にサンプルコードを示します。

例: landing.html

<script>

$(function() {
    // OpenID Connect 認証完了時の処理 (上記参照)
    ・・・

    // Nebula 初期化
    Nebula.initialize(NebulaConfig);

    // ワンタイムトークンを指定
    var userInfo = {
        token: oneTimeToken
    };

    // ログイン
    Nebula.User.login(userInfo)
        .then(function(user) {
            // login ok
            $("#result").text("Login succeeded: username=" + user.username);
        })
        .catch(function(err) {
            // login failure
            $("#result").text("Login failed: " + err);
        });
});

</script>

Result:<br/>
<div id="result"></div>

NebulaConfig には接続先のBaaS設定情報を指定してください。

詳しくは JavaScript SDK マニュアルを参照してください。