From b7573a40d76d2181a9b0c1f6983da1a0b9b8dc1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 11 Jun 2023 13:14:45 +0200 Subject: [PATCH] Fixed webauthn two factor authentication --- assets/js/webauthn_tfa.js | 20 ++++++++---- composer.json | 10 ++---- composer.lock | 67 +++++++++++++++++++++++---------------- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/assets/js/webauthn_tfa.js b/assets/js/webauthn_tfa.js index a2e00595..4d54efc0 100644 --- a/assets/js/webauthn_tfa.js +++ b/assets/js/webauthn_tfa.js @@ -21,8 +21,13 @@ class WebauthnTFA { -// Decodes a Base64Url string - _base64UrlDecode = (input) => { + _b64UrlSafeEncode = (str) => { + const b64 = btoa(str); + return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); + } + + // Decodes a Base64Url string + _b64UrlSafeDecode = (input) => { input = input .replace(/-/g, '+') .replace(/_/g, '/'); @@ -39,13 +44,16 @@ class WebauthnTFA { }; // Converts an array of bytes into a Base64Url string - _arrayToBase64String = (a) => btoa(String.fromCharCode(...a)); + _arrayToBase64String = (a) => { + const str = String.fromCharCode(...a); + return this._b64UrlSafeEncode(str); + } // Prepares the public key options object returned by the Webauthn Framework _preparePublicKeyOptions = publicKey => { //Convert challenge from Base64Url string to Uint8Array publicKey.challenge = Uint8Array.from( - this._base64UrlDecode(publicKey.challenge), + this._b64UrlSafeDecode(publicKey.challenge), c => c.charCodeAt(0) ); @@ -67,7 +75,7 @@ class WebauthnTFA { return { ...data, id: Uint8Array.from( - this._base64UrlDecode(data.id), + this._b64UrlSafeDecode(data.id), c => c.charCodeAt(0) ), }; @@ -81,7 +89,7 @@ class WebauthnTFA { return { ...data, id: Uint8Array.from( - this._base64UrlDecode(data.id), + this._b64UrlSafeDecode(data.id), c => c.charCodeAt(0) ), }; diff --git a/composer.json b/composer.json index 49d3625f..078ebaaf 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "florianv/swap": "^4.0", "florianv/swap-bundle": "dev-master", "gregwar/captcha-bundle": "^2.1.0", - "jbtronics/2fa-webauthn": "dev-master", + "jbtronics/2fa-webauthn": "^v2.0.0", "jfcherng/php-diff": "^6.14", "league/csv": "^9.8.0", "league/html-to-markdown": "^5.0.1", @@ -154,11 +154,5 @@ "allow-contrib": false, "require": "6.2.*" } - }, - "repositories": [ - { - "type": "git", - "url": "https://github.com/jbtronics/2fa-webauthn.git" - } - ] + } } diff --git a/composer.lock b/composer.lock index bb395bfb..480b6da2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b0d4bf26f478ca8451e65e618de7bde7", + "content-hash": "fa0dafb8fc42546d15378323ee9b6fb0", "packages": [ { "name": "beberlei/assert", @@ -2454,31 +2454,39 @@ }, { "name": "jbtronics/2fa-webauthn", - "version": "dev-master", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/jbtronics/2fa-webauthn.git", - "reference": "ef886b0654766a6adb1e027ed1b3b57a3cbb9c5a" + "reference": "807ae06ccbc73a17983ea80b5a2e4cc78c07f8ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jbtronics/2fa-webauthn/zipball/807ae06ccbc73a17983ea80b5a2e4cc78c07f8ad", + "reference": "807ae06ccbc73a17983ea80b5a2e4cc78c07f8ad", + "shasum": "" }, "require": { "ext-json": "*", "nyholm/psr7": "^1.5", - "php": "^7.4.0|^8.0", - "scheb/2fa-bundle": "^5.0.0|^6.0.0", - "symfony/framework-bundle": "^5.0|^6.0", + "php": "^8.1", + "scheb/2fa-bundle": "^6.0.0", + "symfony/framework-bundle": "^6.0", "symfony/psr-http-message-bridge": "^2.1", - "web-auth/webauthn-lib": "^3.3|^4.0" + "symfony/uid": "^6.0", + "web-auth/webauthn-lib": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5", + "roave/security-advisories": "dev-latest" }, - "default-branch": true, "type": "symfony-bundle", "autoload": { "psr-4": { "Jbtronics\\TFAWebauthn\\": "src/" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2497,7 +2505,11 @@ "two-factor-authentication", "webauthn" ], - "time": "2023-05-27T18:21:46+00:00" + "support": { + "issues": "https://github.com/jbtronics/2fa-webauthn/issues", + "source": "https://github.com/jbtronics/2fa-webauthn/tree/v2.0.0" + }, + "time": "2023-06-11T11:09:45+00:00" }, { "name": "jfcherng/php-color-output", @@ -5555,23 +5567,23 @@ }, { "name": "s9e/text-formatter", - "version": "2.13.1", + "version": "2.14.0", "source": { "type": "git", "url": "https://github.com/s9e/TextFormatter.git", - "reference": "bbd9e34e9c30d5daeb780f115fe69cd81dd9c352" + "reference": "48a2f3a3fb18af8d78330204732a3369441c4060" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/bbd9e34e9c30d5daeb780f115fe69cd81dd9c352", - "reference": "bbd9e34e9c30d5daeb780f115fe69cd81dd9c352", + "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/48a2f3a3fb18af8d78330204732a3369441c4060", + "reference": "48a2f3a3fb18af8d78330204732a3369441c4060", "shasum": "" }, "require": { "ext-dom": "*", "ext-filter": "*", "lib-pcre": ">=8.13", - "php": ">=7.4", + "php": "^8.0", "s9e/regexp-builder": "^1.4", "s9e/sweetdom": "^2.0" }, @@ -5591,7 +5603,7 @@ }, "type": "library", "extra": { - "version": "2.13.1" + "version": "2.14.0" }, "autoload": { "psr-4": { @@ -5623,9 +5635,9 @@ ], "support": { "issues": "https://github.com/s9e/TextFormatter/issues", - "source": "https://github.com/s9e/TextFormatter/tree/2.13.1" + "source": "https://github.com/s9e/TextFormatter/tree/2.14.0" }, - "time": "2023-02-11T00:18:05+00:00" + "time": "2023-06-08T07:19:50+00:00" }, { "name": "sabberworm/php-css-parser", @@ -15582,16 +15594,16 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.48.0", + "version": "v1.49.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "2e428e8432e9879187672fe08f1cc335e2a31dd6" + "reference": "ce1d424f76bbb377f1956cc7641e8e2eafe81cde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/2e428e8432e9879187672fe08f1cc335e2a31dd6", - "reference": "2e428e8432e9879187672fe08f1cc335e2a31dd6", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/ce1d424f76bbb377f1956cc7641e8e2eafe81cde", + "reference": "ce1d424f76bbb377f1956cc7641e8e2eafe81cde", "shasum": "" }, "require": { @@ -15605,7 +15617,8 @@ "symfony/filesystem": "^5.4.7|^6.0", "symfony/finder": "^5.4.3|^6.0", "symfony/framework-bundle": "^5.4.7|^6.0", - "symfony/http-kernel": "^5.4.7|^6.0" + "symfony/http-kernel": "^5.4.7|^6.0", + "symfony/process": "^5.4.7|^6.0" }, "conflict": { "doctrine/doctrine-bundle": "<2.4", @@ -15617,9 +15630,8 @@ "doctrine/doctrine-bundle": "^2.4", "doctrine/orm": "^2.10.0", "symfony/http-client": "^5.4.7|^6.0", - "symfony/phpunit-bridge": "^5.4.7|^6.0", + "symfony/phpunit-bridge": "^5.4.17|^6.0", "symfony/polyfill-php80": "^1.16.0", - "symfony/process": "^5.4.7|^6.0", "symfony/security-core": "^5.4.7|^6.0", "symfony/yaml": "^5.4.3|^6.0", "twig/twig": "^2.0|^3.0" @@ -15655,7 +15667,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.48.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.49.0" }, "funding": [ { @@ -15671,7 +15683,7 @@ "type": "tidelift" } ], - "time": "2022-11-14T10:48:46+00:00" + "time": "2023-06-07T13:10:14+00:00" }, { "name": "symfony/phpunit-bridge", @@ -16005,7 +16017,6 @@ "minimum-stability": "stable", "stability-flags": { "florianv/swap-bundle": 20, - "jbtronics/2fa-webauthn": 20, "roave/security-advisories": 20 }, "prefer-stable": false,