Files
Passkeys/Resource/template/default/passkey.twig
2025-10-06 21:45:33 +09:00

193 lines
6.7 KiB
Twig

{#
This file is part of EC-CUBE
Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
http://www.ec-cube.co.jp/
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
#}
{% extends 'default_frame.twig' %}
{% set body_class = 'mypage' %}
{% block stylesheet %}
<style>
.ec-login-header {
background: #FFFFFF;
}
.ec-login-header > p {
text-align: center;
font: var(--unnamed-font-style-normal) normal medium 16px/22px YuGothic;
letter-spacing: var(--unnamed-character-spacing-0);
text-align: center;
font: normal normal medium 16px/22px YuGothic;
letter-spacing: 0px;
color: #525263;
opacity: 1;
}
</style>
{% endblock %}
{% block javascript %}
<script src="{{ asset('passkeys/assets/dfido2-lib.js', 'plugin') }}"></script>
<script>
setFidoServerURL('https://fido2.amipro.me');//'https://mac-air-m2.dqj-home.com');
var rp, full_uid, domain;
window.onload = async function() {
domain = window.location.hostname
rp = domain + '.ec-cube.service';
full_uid = "{{ Customer.username }}_"+domain;
if(!isWebAuthnSupported()){
alert("パスキーをサポートしないブラウザを利用しているため、パスキー認証を無効にします。");
$('#mode').val('no_webauthn');
$('#passkey_form').submit();
return;
}
setTimeout(function(){
$('#auto_message').hide();
$('#login_form').show();
$('#login_email').val("{{ Customer.username }}");
$('#login_email').focus();
}, 6000);
/*const sessionOk = await validSession(rp);
if(sessionOk){
alert("sessionOk: {{ url(succ_route) }}");
window.location.href = "{{ url(succ_route) }}";
return;
}*/
//Try auth first
await logoutFido2UserSession();
if(canTryAutoAuthentication()){
if(await authenticate(full_uid)){
const session = getSessionId();
$('#mode').val('login_succ');
$('#pk_session').val(session);
$('#rp').val(rp);
//alert("{{ succ_route }}"+"|"+full_uid+"|"+session);
$('#passkey_form').submit();
return;
}
}
//Try register
alert("生体認証を有効するために、次の画面で生体認証を行ってください。");
await register(full_uid);
};
async function clickedAuthenticate(){
var uid = $('#login_email').val()
if(uid && 0==uid.length)uid=full_uid
else uid = uid+'_'+domain;
if(await authenticate(uid)){
const session = getSessionId();
$('#mode').val('login_succ');
$('#pk_session').val(session);
$('#rp').val(rp);
//alert("{{ succ_route }}"+"|"+uid+"|"+session);
$('#passkey_form').submit();
return;
}
}
async function authenticate(uid_full){
const result = await authenticateFido2(uid_full, rp);
if(result.status === 'ok'){
return true;
}else{
errProcessFido2(result)
return false;
}
}
async function clickedRegister(){
var uid = $('#login_email').val()
if(uid && 0==uid.length)uid=full_uid;
else uid = uid+'_'+domain;
await register(uid);
}
async function register(uid_full){
const result = await registerFido2(uid_full, 'dis_'+uid_full, rp);
if(result.status === 'ok'){
const session = getSessionId();
$('#mode').val('login_succ');
$('#pk_session').val(session);
$('#rp').val(rp);
//alert("Reg succ:{{ succ_route }}"+"|"+uid_full+"|"+session);
$('#passkey_form').submit();
return;
}else{
const msg = errMessageFido2(result);
//alert('reg err:'+msg);
if(msg && msg.startsWith('Fido2LibErr105')){
//alert('retry auth:'+msg);
if(await authenticate(rp)){
const session = getSessionId();
$('#mode').val('login_succ');
$('#pk_session').val(session);
$('#rp').val(rp);
//alert("{{ succ_route }}"+"|"+uid+"|"+session);
$('#passkey_form').submit();
return;
}
}else alert(msg)
}
}
</script>
{% endblock javascript %}
{% block main %}
<div class="ec-role">
<div class="ec-pageHeader">
<h1>{{ 'front.passkeys.title'|trans }}</h1>
</div>
<div class="ec-off2Grid">
<div class="ec-off2Grid__cell">
<form name="passkey_form" id="passkey_form" method="post"
action="{{ url('plg_customer_passkey_page') }}">
<input type="hidden" name="mode" id="mode" value="login">
<input type="hidden" name="pk_session" id="pk_session" value="">
<input type="hidden" name="rp" id="rp" value="">
<div class="ec-login ec-login-header" id='auto_message'>
<p>{{ 'front.passkeys.message'|trans|nl2br }}</p>
</div>
<div class="ec-login" id='login_form' style='display:none;'>
<!-- div class="ec-login__icon">
<div class="ec-icon"><img src="{{ asset('assets/icon/user.svg') }}" alt=""></div>
</div -->
<div class="ec-login__input">
<div class="ec-input">
<input type="text" name="login_email" id="login_email" class="ec-input__field"
placeholder="{{ 'front.passkeys.email'|trans }}" value="{{ Customer.username }}">
</div>
</div>
<div class="ec-cartNaviIsset__action">
<a class="ec-blockBtn--primary" href="javascript:clickedAuthenticate();">{{ 'front.passkeys.auth'|trans }}</a>
<br><br>
<a class="ec-blockBtn--action" href="javascript:clickedRegister();">{{ 'front.passkeys.register'|trans }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
{% endblock %}