diff --git a/gatekeeper/views.py b/gatekeeper/views.py index 567a7cd..842ba6f 100644 --- a/gatekeeper/views.py +++ b/gatekeeper/views.py @@ -183,7 +183,7 @@ def view_manage_auth_method(request):

Users will authenticate via an external identity provider (like Keycloak, Google, or Authelia). Requires Provider URL, Client ID, and Client Secret.

TOTP (Time-Based One-Time Password)
-

Users will need to enter a rotating token from an authenticator app. Requires setting a Global TOTP Secret.
If Global TOTP Before Authentication is enabled, the PIN is required before the username and password to help combat bruteforce attacks.

+

Users will need to enter a rotating token from an authenticator app. If a user does not have a personal TOTP configured, the Global TOTP Secret will be used instead.

''') } diff --git a/templates/gatekeeper/gatekeeper_auth_method_form.html b/templates/gatekeeper/gatekeeper_auth_method_form.html index b653cee..1b8f847 100644 --- a/templates/gatekeeper/gatekeeper_auth_method_form.html +++ b/templates/gatekeeper/gatekeeper_auth_method_form.html @@ -60,21 +60,40 @@ toggleFields(); var qrContainer = $(''); - var btnShowQr = $(''); - + var btnShowQr = $(''); + var btnGenerate = $(''); + $('#div_id_totp_secret').append(btnShowQr); + $('#div_id_totp_secret').append(btnGenerate); $('#div_id_totp_secret').append(qrContainer); + function generateBase32Secret() { + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; + var randomBytes = new Uint8Array(32); + window.crypto.getRandomValues(randomBytes); + var result = ''; + for (var digit = 0; digit < 32; digit++) { + result += chars[randomBytes[digit] % 32]; + } + return result; + } + + $('#btnGenerateTotp').click(function (e) { + e.preventDefault(); + $('#id_totp_secret').val(generateBase32Secret()); + $('#qrCodeContainer').slideUp(); + }); + $('#btnShowQr').click(function (e) { e.preventDefault(); var secret = $('#id_totp_secret').val(); var name = $('#id_name').val() || 'Gatekeeper'; - + if (!secret) { alert("{% trans 'Please enter a TOTP Secret first to generate the QR code.' %}"); return; } - + var url = '/gatekeeper/auth_method/qr/?secret=' + encodeURIComponent(secret) + '&name=' + encodeURIComponent(name); $('#qrCodeImg').attr('src', url); $('#qrCodeContainer').slideToggle();