1. 説明
1.Ajaxとは“Asynchronous Javascript And XML”(非同期 JavaScript と XML)です。バックグラウンドで少な目なデータ交換により、画面を非同期更新することができます。
※全画面ではなく、一部の画面のみを更新する。
2.iframe方式とAjax方式の区別:
2-1.iframe方式とAjax 方式は両方クロスドメインシングルサインオンを実現出来ます。
2-2.Ajaxは非同期のSSOを実現出来、そして認証の結果を処理することができます。 ※ログインタイムアウトなど
2-3.iframe方式は非同期のSSOを実現出来ません、認証の結果を処理することもできません。
2. 実現
Ajax ログイン方式は自然にクロスドメインをサポートする。直接にAjaxでユーザIDとパスワードを帳票サーバーへ送信し認証すれば実現できます。
3. 事例
簡易なログイン画面を作成しajaxの実現方法を紹介します。
3.1 Ajax 実現
1)ログインボタンにイベント設定
ユーザが画面上にユーザIDとパスワードを入力そしてログインボタンをクリックる時、 doSubmit() イベントを実行する。このイベントはAjax方式でユーザIDとパスワードを帳票サーバーへ送信し認証を行う、認証成功する場合FineReportポータル画面へ遷移する。
ソースコード:
function doSubmit() {
var username = document.getElementById("username").value.trim();
var password = document.getElementById("password").value.trim();
if (username === "") {
window.alert("ユーザIDを入力してください");
return false;
}
if (password === "") {
window.alert("パスワードを入力してください");
return false;
}
var url = "http://localhost:8080/webroot/decision/login/cross/domain" + "?fine_username=" + username + "&fine_password=" + password + "&validity=" + -1;
jQuery.ajax({
url: url,//シングルサインオンの帳票サーバーURL
timeout: 5000,//タイムアウト時間(単位:ミリ秒)
dataType:"jsonp",//クロスドメインjsonp方式
jsonp:"callback",
success: function (res) {
console.log(res);
if (res.errorCode) {
window.alert(res.errorMsg);
}else {
// tokenを保存し、FineReportポータルへ遷移
window.location.href = "http://localhost:8080/webroot/decision";
}
},
error: function () {
alert("タイムアウト或いはその他のエラー");
}
});
}
注意1:Ajaxを利用するため、jquery.jsを参照する必要があります。
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
注意2:Win8の場合もしログイン異常が発生したら、AjaxでユーザIDとパスワードを送信する時エンコードすれば改善できます。
※例: fine_password":encodeURIComponent(password)。
3.2 完全なスースコード
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; " charset="UTF-8">
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
function doSubmit() {
var username = document.getElementById("username").value.trim();
var password = document.getElementById("password").value.trim();
if (username === "") {
window.alert("ユーザIDを入力してください");
return false;
}
if (password === "") {
window.alert("パスワードを入力してください");
return false;
}
var url = "http://localhost:8080/webroot/decision/login/cross/domain" + "?fine_username=" + username + "&fine_password=" + password + "&validity=" + -1;
jQuery.ajax({
url: url,//シングルサインオンの帳票サーバーURL
timeout: 5000,//タイムアウト時間(単位:ミリ秒)
dataType:"jsonp",//クロスドメインはjsonp方式
jsonp:"callback",
success: function (res) {
console.log(res);
if (res.errorCode) {
window.alert(res.errorMsg);
}else {
// tokenを保存しFineReportポータルへ遷移
window.location.href = "http://localhost:8080/webroot/decision";
}
},
error: function () {
alert("タイムアウト或いはその他のエラー");// ログイン失敗
}
});
}
</script>
</head>
<body>
<p>ログイン画面</p>
<form id="login" name="login" method="POST" action="">
<p>ユーザID:<input id="username" type="text" name="username"/></p>
<p>パスワード:<input id="password" type="password" name="password"/></p>
<input type="button" value="ログイン" onClick="doSubmit()"/>
</form>
</body>
</html>
4. ログアウト
基幹システムをログアウトする同時に、FineReportポータルをログアウトする時下記のような方法で実現出来ます。
jQuery.ajax({
url:"http://localhost:8075/webroot/decision/logout/cross/domain",//シングルサインオンの帳票サーバー
dataType:"jsonp",//クロスドメインjsonp方式
jsonp:"callback",
timeout:5000,//タイムアウト時間(単位:ミリ秒)
success:function(data) {
if (data.status === "success") {
//ログアウト成功
}
},
error:function(){
// ログアウト失敗(タイムアウト或いはその他のエラー)
}
});
5. 安全性
URLでユーザIDとパスワードで検証する時、不法侵入で盗聴されるリスクがあります。
下記の方法で改善できます:
1.HTTPSを構築
2.パスワード暗号化送信(※必要なかたは弊社担当者と連絡ください)
6. 注意事項
クロスドメインシングルサインオンの場合、下記の設定を無効にする必要があります。
