Compare commits
3 Commits
feature/RE
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7248372cd8 | ||
|
|
1d2f4dfc9b | ||
|
|
03ce446b8a |
@@ -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_REGISTERED = 'dfido2_lib_registered'
|
||||
const DFIDO2_LIB_LOCALSTG_NAME_SVR_URL = 'dfido2_lib_svr_url'
|
||||
@@ -241,16 +250,64 @@ 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(i18n_messages, 'Fido2LibErr104:');
|
||||
rtn=getI18NErrorMessage('Fido2LibErr104:');
|
||||
}
|
||||
|
||||
return rtn;
|
||||
@@ -259,7 +316,17 @@ function errMessageFido2(result){
|
||||
const fido2LibErrCodes = {
|
||||
user_canceled : -101,
|
||||
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();
|
||||
@@ -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('SvrErr120:', 'User has reached the device limit!');
|
||||
|
||||
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.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.set(fido2LibErrMsgLanguages.japanese, new Map());
|
||||
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('SvrErr120:', 'ユーザーはデバイスの制限数に達しました!');
|
||||
|
||||
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.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.set(fido2LibErrMsgLanguages.chinese_cn, new Map());
|
||||
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('SvrErr120:', '用户已达到设备限制数!');
|
||||
|
||||
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr101:', '您的浏览器不支持FIDO2.');
|
||||
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr102:', '用户取消了操作。');
|
||||
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('Fido2LibErr103:', '操作超时。');
|
||||
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr104:', '系统错误。');
|
||||
errMsgs.get(fido2LibErrMsgLanguages.chinese_cn).set('Fido2LibErr105:', '无法再次注册相同的认证器。');
|
||||
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:', '发生数据错误。');
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -489,6 +592,7 @@ 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){
|
||||
@@ -496,7 +600,27 @@ async function doAttestation(username, displayName, rpId, userVerification = 'pr
|
||||
}else{
|
||||
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;
|
||||
} finally {
|
||||
@@ -607,6 +731,7 @@ 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){
|
||||
@@ -614,7 +739,27 @@ async function doAssertion(username = null, rpId = null, userVerification = 'pre
|
||||
}else{
|
||||
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;
|
||||
} finally {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.fido2-sdk-logo {
|
||||
@@ -86,33 +87,9 @@
|
||||
border-radius: 6px;
|
||||
background-color: #e7f1ff;
|
||||
border-left: 4px solid #0d6efd;
|
||||
}
|
||||
}
|
||||
|
||||
.fido2-sdk-standalone {
|
||||
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 {
|
||||
.fido2-sdk-table .text-danger {
|
||||
color: #dc3545 !important;
|
||||
text-decoration: none;
|
||||
transition: all 0.2s ease;
|
||||
@@ -134,15 +111,11 @@
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.fido2-sdk-modal .modal-dialog {
|
||||
margin: 10px;
|
||||
max-width: calc(100% - 20px);
|
||||
}
|
||||
margin: 10px;
|
||||
max-width: calc(100% - 20px);
|
||||
}
|
||||
|
||||
.fido2-sdk-standalone {
|
||||
padding: 20px 10px;
|
||||
}
|
||||
|
||||
.fido2-sdk-table th,
|
||||
.fido2-sdk-table th,
|
||||
.fido2-sdk-table td {
|
||||
padding: 8px 12px;
|
||||
font-size: 14px;
|
||||
@@ -156,6 +129,25 @@
|
||||
.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
Reference in New Issue
Block a user