2 Commits

Author SHA1 Message Date
dqj
4bd3ca0e2b UI improved 2026-01-22 21:46:12 +09:00
dqj
9218662a4b Removed stanalone support from UI SDK 2026-01-18 22:49:11 +09:00
6 changed files with 80 additions and 1090 deletions

View File

@@ -54,8 +54,8 @@
<script src="files/ua-parser.js"></script>
<script src="files/amipro_utils.js?v=20230401402"></script>
<script src="files/dfido2-lib.js?v=20230918"></script>
<script src="files/amipro_utils.js?v=20260118"></script>
<script src="files/dfido2-lib.js?v=20260118"></script>
<script>

View File

@@ -1,12 +1,3 @@
/**
*
* @file dfido2-lib.js
* @description FIDO2 library of amipro FIDO2 Server
* @version 2025-12-12
* @author Amipro Co., Ltd. (https://www.amipro.me/)
* @license Copyright (c) Amipro Co., Ltd. All rights reserved.
*/
const DFIDO2_LIB_LOCALSTG_NAME_USER_SESSION = 'fido2_user_session'
const DFIDO2_LIB_LOCALSTG_NAME_REGISTERED = 'dfido2_lib_registered'
const DFIDO2_LIB_LOCALSTG_NAME_SVR_URL = 'dfido2_lib_svr_url'
@@ -250,64 +241,16 @@ function errMessageFido2(result){
case fido2LibErrCodes.timeout:
rtn=getI18NErrorMessage('Fido2LibErr103:');
break;
case fido2LibErrCodes.invalid_state:
rtn=getI18NErrorMessage('Fido2LibErr105:');
break;
case fido2LibErrCodes.not_allowed:
rtn=getI18NErrorMessage('Fido2LibErr107:');
break;
case fido2LibErrCodes.abort:
rtn=getI18NErrorMessage('Fido2LibErr108:');
break;
case fido2LibErrCodes.not_supported:
rtn=getI18NErrorMessage('Fido2LibErr109:');
break;
case fido2LibErrCodes.security:
rtn=getI18NErrorMessage('Fido2LibErr110:');
break;
case fido2LibErrCodes.network:
rtn=getI18NErrorMessage('Fido2LibErr111:');
break;
case fido2LibErrCodes.constraint:
rtn=getI18NErrorMessage('Fido2LibErr112:');
break;
case fido2LibErrCodes.not_readable:
rtn=getI18NErrorMessage('Fido2LibErr113:');
break;
case fido2LibErrCodes.encoding:
rtn=getI18NErrorMessage('Fido2LibErr114:');
break;
case fido2LibErrCodes.data_error:
rtn=getI18NErrorMessage('Fido2LibErr115:');
break;
default:
rtn=result.errorMessage?result.errorMessage:getI18NErrorMessage('Fido2LibErr104:');
}
}else if(result.name && "InvalidStateError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr105:');
}else if(result.name && "NotAllowedError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr107:');
}else if(result.name && "AbortError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr108:');
}else if(result.name && "NotSupportedError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr109:');
}else if(result.name && "SecurityError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr110:');
}else if(result.name && "NetworkError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr111:');
}else if(result.name && "ConstraintError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr112:');
}else if(result.name && "NotReadableError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr113:');
}else if(result.name && "EncodingError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr114:');
}else if(result.name && "DataError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr115:');
}else if(result.errorMessage){
const msg = getI18NErrorMessage(result.errorMessage);
rtn=msg?msg:result.errorMessage;
}else{
rtn=getI18NErrorMessage('Fido2LibErr104:');
rtn=getI18NErrorMessage(i18n_messages, 'Fido2LibErr104:');
}
return rtn;
@@ -316,17 +259,7 @@ function errMessageFido2(result){
const fido2LibErrCodes = {
user_canceled : -101,
timeout : -102,
unknown : -999,
invalid_state : -103,
not_allowed : -104,
abort : -105,
not_supported : -106,
security : -107,
network : -108,
constraint : -109,
not_readable : -110,
encoding : -111,
data_error : -112
unknown : -999
}
const errMsgs = new Map();
@@ -356,23 +289,11 @@ errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr118:', 'Signature is not
errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr119:', 'No user session!');
errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr120:', 'User has reached the device limit!');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr101:', 'Your browser does not support FIDO2/WebAuthn.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr102:', 'The operation was canceled by the user.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr103:', 'The operation timed out.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr104:', 'A system error occurred.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr105:', 'The authenticator contains credentials that are already registered with this website.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr106:', 'Another request is already in progress.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr107:', 'The operation was not allowed.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr108:', 'The operation was aborted.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr109:', 'This operation is not supported on your device.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr110:', 'A security error occurred.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr111:', 'A network error occurred.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr112:', 'The operation failed due to a constraint violation.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr113:', 'Could not read the credential.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr114:', 'The data format is invalid.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr115:', 'A data error occurred.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr106:', 'Another request is already in progress.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr101:', 'Your browser does not support FIDO2.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr102:', 'The user canceled.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr103:', 'The process timeout.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr104:', 'System error.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr105:', 'The same authenticator cannot be registered again.');
errMsgs.set(fido2LibErrMsgLanguages.japanese, new Map());
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr101:', '登録されていないエンタープライズ認証デバイス aaguid!');
@@ -394,23 +315,11 @@ errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr118:', '署名は base6
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr119:', 'ユーザーセッションがありません!');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr120:', 'ユーザーはデバイスの制限数に達しました!');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr101:', 'お使いのブラウザは FIDO2/WebAuthn をサポートしていません。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr102:', 'ユーザーによって操作がキャンセルされました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr103:', '操作がタイムアウトしました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr104:', 'システムエラーが発生しました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr105:', 'この認証デバイスには、すでにこの网站に登録されている憑拠が含まれています。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr106:', '別のリクエストがすでに進行中です。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr107:', '操作が許可されませんでした。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr108:', '操作が中止されました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr109:', 'この機器ではこの操作はサポートされていません。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr110:', 'セキュリティエラーが発生しました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr111:', 'ネットワークエラーが発生しました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr112:', '制約違反のため操作に失敗しました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr113:', '憑拠を読み取れませんでした。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr114:', 'データ形式が無効です。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr115:', 'データエラーが発生しました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr106:', '別のリクエストがすでに進行中です。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr101:', 'お使いのブラウザは FIDO2 をサポートしていません。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr102:', 'ユーザーがキャンセルました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr103:', 'プロセスがタイムアウトしました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr104:', 'システムエラー。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr105:', '同じ認証デバイスを再登録することはできません。');
errMsgs.set(fido2LibErrMsgLanguages.chinese_cn, new Map());
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr101:', '未注册的企业认证器 aaguid!');
@@ -432,23 +341,11 @@ errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr118:', '签名不是
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr119:', '未建立用户会话!');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr120:', '用户已达到设备限制数!');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr106:', '另一个请求正在进行中。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2/WebAuthn。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '操作已被用户取消。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2.');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '用户取消了操作。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr103:', '操作超时。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '发生系统错误。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr105:', '您的认证器包含已在此网站注册的凭据。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr106:', '另一个请求正在进行中。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr107:', '操作不被允许。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr108:', '操作已中止。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr109:', '您的设备不支持此操作。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr110:', '发生安全错误。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr111:', '发生网络错误。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr112:', '由于约束冲突,操作失败。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr113:', '无法读取凭据。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr114:', '数据格式无效。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr115:', '发生数据错误。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '系统错误。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr105:', '无法再次注册相同的认证器。');
/**
*
@@ -592,7 +489,6 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
} catch (err) {
var errRtn = {status:'failed', errorMessage: err.message};
if(err.name) errRtn.name = err.name
if(err.name && 'NotAllowedError' === err.name){
const nowtm = (new Date()).getTime()
if(nowtm > process_time_limit){
@@ -600,27 +496,7 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
}else{
errRtn.errCode = fido2LibErrCodes.user_canceled
}
} else if(err.name && 'InvalidStateError' === err.name){
errRtn.errCode = fido2LibErrCodes.invalid_state
} else if(err.name && 'AbortError' === err.name){
errRtn.errCode = fido2LibErrCodes.abort
} else if(err.name && 'NotSupportedError' === err.name){
errRtn.errCode = fido2LibErrCodes.not_supported
} else if(err.name && 'SecurityError' === err.name){
errRtn.errCode = fido2LibErrCodes.security
} else if(err.name && 'NetworkError' === err.name){
errRtn.errCode = fido2LibErrCodes.network
} else if(err.name && 'ConstraintError' === err.name){
errRtn.errCode = fido2LibErrCodes.constraint
} else if(err.name && 'NotReadableError' === err.name){
errRtn.errCode = fido2LibErrCodes.not_readable
} else if(err.name && 'EncodingError' === err.name){
errRtn.errCode = fido2LibErrCodes.encoding
} else if(err.name && 'DataError' === err.name){
errRtn.errCode = fido2LibErrCodes.data_error
} else {
errRtn.errCode = fido2LibErrCodes.unknown
}
}else errRtn.errCode = fido2LibErrCodes.unknown
return errRtn;
} finally {
@@ -731,7 +607,6 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
} catch (err) {
var errRtn = {status:'failed', errorMessage: err.message};
if(err.name) errRtn.name = err.name
if(err.name && 'NotAllowedError' === err.name){
const nowtm = (new Date()).getTime()
if(nowtm > process_time_limit){
@@ -739,27 +614,7 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
}else{
errRtn.errCode = fido2LibErrCodes.user_canceled
}
} else if(err.name && 'InvalidStateError' === err.name){
errRtn.errCode = fido2LibErrCodes.invalid_state
} else if(err.name && 'AbortError' === err.name){
errRtn.errCode = fido2LibErrCodes.abort
} else if(err.name && 'NotSupportedError' === err.name){
errRtn.errCode = fido2LibErrCodes.not_supported
} else if(err.name && 'SecurityError' === err.name){
errRtn.errCode = fido2LibErrCodes.security
} else if(err.name && 'NetworkError' === err.name){
errRtn.errCode = fido2LibErrCodes.network
} else if(err.name && 'ConstraintError' === err.name){
errRtn.errCode = fido2LibErrCodes.constraint
} else if(err.name && 'NotReadableError' === err.name){
errRtn.errCode = fido2LibErrCodes.not_readable
} else if(err.name && 'EncodingError' === err.name){
errRtn.errCode = fido2LibErrCodes.encoding
} else if(err.name && 'DataError' === err.name){
errRtn.errCode = fido2LibErrCodes.data_error
} else {
errRtn.errCode = fido2LibErrCodes.unknown
}
}else errRtn.errCode = fido2LibErrCodes.unknown
return errRtn;
} finally {

View File

@@ -16,7 +16,6 @@
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
.fido2-sdk-logo {
@@ -129,25 +128,6 @@
.fido2-sdk-logo {
max-height: 30px;
}
.fido2-sdk-status-badge {
width: 100%;
order: 3;
margin-top: 8px;
}
.fido2-sdk-header .btn-close {
order: 2;
margin-left: auto;
}
.fido2-sdk-header .modal-title {
order: 1;
}
.fido2-sdk-header .fido2-sdk-logo {
order: 0;
}
}
.fido2-sdk-loading {

File diff suppressed because it is too large Load Diff

View File

@@ -53,15 +53,15 @@
<script src="files/menu.js"></script>
<script src="files/main.js"></script>
<script src="files/amipro_utils.js?v=20230414"></script>
<script src="files/dfido2-lib.js?v=2025092701"></script>
<script src="files/amipro_utils.js?v=20260118"></script>
<script src="files/dfido2-lib.js?v=20260118"></script>
<script>
<!--
// For stand alone: 'https://local.dqj-macpro.com'
// For proxy: set 'https://mac-air-m2.dqj-home.com'
-->
setFidoServerURL('https://local.dqj-macpro.com');//'https://fido2.amipro.me');
setFidoServerURL('https://fido2.amipro.me'); //'https://local.dqj-macpro.com');
const i18n_messages = new Map();

View File

@@ -213,9 +213,9 @@
i18n_messages.set("msg_login_desc", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Login");
lang_map.set("zh-CN", "登录");
lang_map.set("ja", "ログイン");
lang_map.set("en-US", "Passkey Login");
lang_map.set("zh-CN", "Passkey 登录");
lang_map.set("ja", "パスキーログイン");
i18n_messages.set("msg_btn_passkey_login", lang_map);
lang_map = new Map();
@@ -361,9 +361,10 @@
lang_map.set("zh-CN", "事件回调系统");
lang_map.set("ja", "イベント コールバック システム");
i18n_messages.set("msg_feature_9", lang_map);
lang_map.set("zh-CN", "主题色和样式定制");
lang_map.set("ja", "テーマの色とスタイルのカスタマイズ");
i18n_messages.set("msg_feature_7", lang_map);
lang_map.set("en-US", "Event callback system");
lang_map.set("zh-CN", "事件回调系统");
lang_map.set("ja", "イベント コールバック システム");
i18n_messages.set("msg_feature_9", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Login Default");
@@ -371,51 +372,6 @@
lang_map.set("ja", "ログイン デフォルト");
i18n_messages.set("msg_code_login_default", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Login Custom");
lang_map.set("zh-CN", "登录定制");
lang_map.set("ja", "ログイン カスタム");
i18n_messages.set("msg_code_login_custom", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Device Manager Default");
lang_map.set("zh-CN", "设备管理缺省");
lang_map.set("ja", "デバイス管理 デフォルト");
i18n_messages.set("msg_code_device_default", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Device Manager Custom");
lang_map.set("zh-CN", "设备管理定制");
lang_map.set("ja", "デバイス管理 カスタム");
i18n_messages.set("msg_code_device_custom", lang_map);
lang_map = new Map();
lang_map.set("en-US", "JS Import Examples:");
lang_map.set("zh-CN", "JS 引入示例:");
lang_map.set("ja", "JS インポート例:");
i18n_messages.set("msg_js_import_examples", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Multi-language support (English/Japanese/Chinese)");
lang_map.set("zh-CN", "多语言支持(英/日/中)");
lang_map.set("ja", "多言語対応(英/日/中)");
i18n_messages.set("msg_feature_8", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Event callback system");
lang_map.set("zh-CN", "事件回调系统");
lang_map.set("ja", "イベント コールバック システム");
i18n_messages.set("msg_feature_9", lang_map);
lang_map.set("zh-CN", "多语言支持(英/日/中)");
lang_map.set("ja", "多言語対応(英/日/中)");
i18n_messages.set("msg_feature_8", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Event callback system");
lang_map.set("zh-CN", "事件回调系统");
lang_map.set("ja", "イベント コールバック システム");
i18n_messages.set("msg_feature_9", lang_map);
lang_map = new Map();
lang_map.set("en-US", "📊 Event Log");
lang_map.set("zh-CN", "📊 事件日志");
@@ -482,6 +438,12 @@
lang_map.set("ja", "エラーが発生しました");
i18n_messages.set("msg_log_error", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Password attempts exhausted");
lang_map.set("zh-CN", "密码尝试次数已用完");
lang_map.set("ja", "パスワード試行回数が上限に達しました");
i18n_messages.set("msg_password_exhausted", lang_map);
lang_map = new Map();
lang_map.set("en-US", "Device manager closed");
lang_map.set("zh-CN", "设备管理器已关闭");
@@ -665,7 +627,7 @@ Fido2UIManager.renderDeviceManager({<br>
<div id="device-container"></div>
<script>
const SERVER_URL = 'https://local.dqj-macpro.com';//'https://fido2.amipro.me';
const SERVER_URL = 'https://fido2.amipro.me'; //'https://local.dqj-macpro.com';
let currentUserId = null;
let isLoggedIn = false;
@@ -904,7 +866,7 @@ Fido2UIManager.renderDeviceManager({<br>
const entry = document.createElement('div');
entry.className = 'log-entry';
const time = new Date().toLocaleTimeString('zh-CN');
const time = new Date().toLocaleTimeString(CURRENT_LANG);
const typeClass = 'log-type-' + type;
entry.innerHTML = `<span class="log-time">[${time}]</span><span class="${typeClass}">[${type.toUpperCase()}]</span> ${message}`;