5.8.1. Web アプリケーション¶
JavaScript を使った SAML 認証方法を記載します。
大きく分けて、以下の3つの処理を実装します。
- SAML 認証開始 REST API の実行
- SAML 認証完了時の処理
- BaaS サーバへのログイン
SAML認証開始¶
SAML 認証開始の REST API を実行します。 リクエストパラメータに、ランディングページの URL を指定します。
REST API の URI は、以下のとおりです。
{endpointUri}/1/{tenantId}/auth/saml/init?redirect={redirectUri}
以下にサンプルコードを示します。
例: index.html
<script>
function convertAbsUrl(src) {
return $("<a>").attr("href", src).get(0).href;
}
function startSaml() {
var redirectUri = convertAbsUrl("./landing.html");
// REST API 実行 (ページ移動)
var startUri = <EndpointUri> + "/1/" + <tenantId> + "/auth/saml/init?redirect=" + encodeURIComponent(redirectUri);
document.location.href = startUri;
};
</script>
<a href="#" onclick="startSaml();">Start authentication</a>
SAML認証完了時の処理¶
SAML 認証が完了すると、指定したリダイレクト URI (ランディングページ)にリダイレクトされます。 リダイレクト URI は以下のようにワンタイムトークンがクエリパラメータに格納された形になります。
ランディングページ(例: landing.html) はあらかじめ用意しておきます。
リダイレクト URI からワンタイムトークンを取り出します。 以下にサンプルコードを示します。
例: landing.html
$(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 サーバへのログイン実装(下記参照)
//・・・
});
BaaS サーバへのログイン¶
JavaScript SDK のログイン API を使い、ワンタイムトークンを指定してログインします。
サーバからセッショントークンが払いだされ、以降は本セッショントークンで認証が行われます。 以下にサンプルコードを示します。
例: landing.html
<script>
$(function() {
// SAML認証完了時の処理 (上記参照)
・・・
// Nebula 初期化
Nebula.initialize(NebulaConfig);
// ワンタイムトークンを指定
var userInfo = {
token: oneTimeToken,
username: "",
password: ""
};
// ログイン
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 マニュアルを参照してください。