Compare commits

3 Commits

Author SHA1 Message Date
dqj
7248372cd8 Passkey err msg i18n 2026-02-05 10:22:07 +09:00
dqj
1d2f4dfc9b Improve UISDK css for mobile 2026-02-04 23:52:30 +09:00
dqj
03ce446b8a Updated JS in main branch 2026-02-04 13:09:22 +09:00
3 changed files with 1040 additions and 231 deletions

View File

@@ -1,3 +1,12 @@
/**
*
* @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_USER_SESSION = 'fido2_user_session'
const DFIDO2_LIB_LOCALSTG_NAME_REGISTERED = 'dfido2_lib_registered' const DFIDO2_LIB_LOCALSTG_NAME_REGISTERED = 'dfido2_lib_registered'
const DFIDO2_LIB_LOCALSTG_NAME_SVR_URL = 'dfido2_lib_svr_url' const DFIDO2_LIB_LOCALSTG_NAME_SVR_URL = 'dfido2_lib_svr_url'
@@ -240,17 +249,65 @@ function errMessageFido2(result){
break; break;
case fido2LibErrCodes.timeout: case fido2LibErrCodes.timeout:
rtn=getI18NErrorMessage('Fido2LibErr103:'); rtn=getI18NErrorMessage('Fido2LibErr103:');
break; 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: default:
rtn=result.errorMessage?result.errorMessage:getI18NErrorMessage('Fido2LibErr104:'); rtn=result.errorMessage?result.errorMessage:getI18NErrorMessage('Fido2LibErr104:');
} }
}else if(result.name && "InvalidStateError" === result.name){ }else if(result.name && "InvalidStateError" === result.name){
rtn=getI18NErrorMessage('Fido2LibErr105:'); 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){ }else if(result.errorMessage){
const msg = getI18NErrorMessage(result.errorMessage); const msg = getI18NErrorMessage(result.errorMessage);
rtn=msg?msg:result.errorMessage; rtn=msg?msg:result.errorMessage;
}else{ }else{
rtn=getI18NErrorMessage(i18n_messages, 'Fido2LibErr104:'); rtn=getI18NErrorMessage('Fido2LibErr104:');
} }
return rtn; return rtn;
@@ -259,7 +316,17 @@ function errMessageFido2(result){
const fido2LibErrCodes = { const fido2LibErrCodes = {
user_canceled : -101, user_canceled : -101,
timeout : -102, timeout : -102,
unknown : -999 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
} }
const errMsgs = new Map(); const errMsgs = new Map();
@@ -289,11 +356,23 @@ errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr118:', 'Signature is not
errMsgs.get(fido2LibErrMsgLanguages.english).set('SvrErr119:', 'No user session!'); 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('SvrErr120:', 'User has reached the device limit!');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr101:', 'Your browser does not support FIDO2.'); errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr101:', 'Your browser does not support FIDO2/WebAuthn.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr102:', 'The user canceled.'); errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr102:', 'The operation was canceled by the user.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr103:', 'The process timeout.'); errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr103:', 'The operation timed out.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr104:', 'System error.'); errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr104:', 'A system error occurred.');
errMsgs.get(fido2LibErrMsgLanguages.english).set('Fido2LibErr105:', 'The same authenticator cannot be registered again.'); 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.set(fido2LibErrMsgLanguages.japanese, new Map()); errMsgs.set(fido2LibErrMsgLanguages.japanese, new Map());
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr101:', '登録されていないエンタープライズ認証デバイス aaguid!'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr101:', '登録されていないエンタープライズ認証デバイス aaguid!');
@@ -315,11 +394,23 @@ errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr118:', '署名は base6
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr119:', 'ユーザーセッションがありません!'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr119:', 'ユーザーセッションがありません!');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr120:', 'ユーザーはデバイスの制限数に達しました!'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('SvrErr120:', 'ユーザーはデバイスの制限数に達しました!');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr101:', 'お使いのブラウザは FIDO2 をサポートしていません。'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr101:', 'お使いのブラウザは FIDO2/WebAuthn をサポートしていません。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr102:', 'ユーザーがキャンセルました。'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr102:', 'ユーザーによって操作がキャンセルされました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr103:', 'プロセスがタイムアウトしました。'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr103:', '操作がタイムアウトしました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr104:', 'システムエラー。'); errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr104:', 'システムエラーが発生しました。');
errMsgs.get(fido2LibErrMsgLanguages.japanese).set('Fido2LibErr105:', '同じ認証デバイスを再登録することはできません。'); 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.set(fido2LibErrMsgLanguages.chinese_cn, new Map()); errMsgs.set(fido2LibErrMsgLanguages.chinese_cn, new Map());
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr101:', '未注册的企业认证器 aaguid!'); errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr101:', '未注册的企业认证器 aaguid!');
@@ -341,11 +432,23 @@ errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr118:', '签名不是
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr119:', '未建立用户会话!'); errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr119:', '未建立用户会话!');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr120:', '用户已达到设备限制数!'); errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('SvrErr120:', '用户已达到设备限制数!');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2.'); errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr106:', '另一个请求正在进行中。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '用户取消了操作。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2/WebAuthn。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '操作已被用户取消。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr103:', '操作超时。'); errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr103:', '操作超时。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '系统错误。'); errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '发生系统错误。');
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr105:', '无法再次注册相同的认证器。'); 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:', '发生数据错误。');
/** /**
* *
@@ -489,6 +592,7 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
} catch (err) { } catch (err) {
var errRtn = {status:'failed', errorMessage: err.message}; var errRtn = {status:'failed', errorMessage: err.message};
if(err.name) errRtn.name = err.name if(err.name) errRtn.name = err.name
if(err.name && 'NotAllowedError' === err.name){ if(err.name && 'NotAllowedError' === err.name){
const nowtm = (new Date()).getTime() const nowtm = (new Date()).getTime()
if(nowtm > process_time_limit){ if(nowtm > process_time_limit){
@@ -496,7 +600,27 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
}else{ }else{
errRtn.errCode = fido2LibErrCodes.user_canceled errRtn.errCode = fido2LibErrCodes.user_canceled
} }
}else errRtn.errCode = fido2LibErrCodes.unknown } 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
}
return errRtn; return errRtn;
} finally { } finally {
@@ -607,6 +731,7 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
} catch (err) { } catch (err) {
var errRtn = {status:'failed', errorMessage: err.message}; var errRtn = {status:'failed', errorMessage: err.message};
if(err.name) errRtn.name = err.name if(err.name) errRtn.name = err.name
if(err.name && 'NotAllowedError' === err.name){ if(err.name && 'NotAllowedError' === err.name){
const nowtm = (new Date()).getTime() const nowtm = (new Date()).getTime()
if(nowtm > process_time_limit){ if(nowtm > process_time_limit){
@@ -614,7 +739,27 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
}else{ }else{
errRtn.errCode = fido2LibErrCodes.user_canceled errRtn.errCode = fido2LibErrCodes.user_canceled
} }
}else errRtn.errCode = fido2LibErrCodes.unknown } 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
}
return errRtn; return errRtn;
} finally { } finally {

View File

@@ -16,6 +16,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
gap: 12px; gap: 12px;
flex-wrap: wrap;
} }
.fido2-sdk-logo { .fido2-sdk-logo {
@@ -86,33 +87,9 @@
border-radius: 6px; border-radius: 6px;
background-color: #e7f1ff; background-color: #e7f1ff;
border-left: 4px solid #0d6efd; border-left: 4px solid #0d6efd;
} }
.fido2-sdk-standalone { .fido2-sdk-table .text-danger {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 40px 20px;
}
.fido2-sdk-standalone .container {
max-width: 1000px;
}
.fido2-sdk-standalone .card {
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
border: none;
}
.fido2-sdk-standalone .card-header {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border-bottom: 2px solid #dee2e6;
}
.fido2-sdk-standalone .card-body {
background-color: #ffffff;
}
.fido2-sdk-table .text-danger {
color: #dc3545 !important; color: #dc3545 !important;
text-decoration: none; text-decoration: none;
transition: all 0.2s ease; transition: all 0.2s ease;
@@ -134,15 +111,11 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.fido2-sdk-modal .modal-dialog { .fido2-sdk-modal .modal-dialog {
margin: 10px; margin: 10px;
max-width: calc(100% - 20px); max-width: calc(100% - 20px);
} }
.fido2-sdk-standalone { .fido2-sdk-table th,
padding: 20px 10px;
}
.fido2-sdk-table th,
.fido2-sdk-table td { .fido2-sdk-table td {
padding: 8px 12px; padding: 8px 12px;
font-size: 14px; font-size: 14px;
@@ -156,6 +129,25 @@
.fido2-sdk-logo { .fido2-sdk-logo {
max-height: 30px; 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 { .fido2-sdk-loading {

File diff suppressed because it is too large Load Diff