Groundwork for passkey authentication, with the feature switched off by default and no behaviour change when it is off. Decision D1: passkeys require central authentication. A passkey is scoped to a relying party spanning the base domain, which only exists when SUBDOMAIN_REDIRECT is on and AUTH_SUBDOMAIN resolves to a base domain. The RP ID is therefore always that base domain, never the request host. Decision D4: HTTPS is required and is not exemptible. The allowed origin is built as https://{authSubdomain} from configuration and never from the request, so an http:// origin cannot be accepted, and isAvailableFor() additionally refuses to offer the UI on a non-secure connection. The deprecated setSecuredRelyingPartyId() escape hatch is not used and there is deliberately no override that could reintroduce one. Enabling PASSKEY_ENABLED without a usable configuration is a hard error via a non-optional cache warmer, because entrypoint.sh runs cache:warmup on every production boot: a misconfigured deployment fails to start instead of offering a button that cannot work. Also drops 12 obsolete phpstan-baseline entries for TotpTestHelper: adding #[\Override] to its anonymous clock removed the rule violation at its source rather than suppressing it. Suite: 333 tests / 770 assertions (was 313 / 738), 100% coverage on new files. phpstan level 6 clean, php-cs-fixer clean, conformance 35/35.
85 lines
2.1 KiB
JSON
85 lines
2.1 KiB
JSON
{
|
|
"type": "project",
|
|
"license": "MIT",
|
|
"minimum-stability": "stable",
|
|
"prefer-stable": true,
|
|
"require": {
|
|
"php": "^8.5",
|
|
"ext-ctype": "*",
|
|
"ext-iconv": "*",
|
|
"bacon/bacon-qr-code": "^3.1.1",
|
|
"spomky-labs/otphp": "^11.4.2",
|
|
"symfony/cache": "8.1.*",
|
|
"symfony/console": "8.1.*",
|
|
"symfony/flex": "^2.11",
|
|
"symfony/framework-bundle": "8.1.*",
|
|
"symfony/mime": "8.1.*",
|
|
"symfony/rate-limiter": "8.1.*",
|
|
"symfony/runtime": "8.1.*",
|
|
"symfony/twig-bundle": "8.1.*",
|
|
"symfony/uid": "8.1.*",
|
|
"symfony/yaml": "8.1.*",
|
|
"web-auth/webauthn-lib": "^5.3"
|
|
},
|
|
"config": {
|
|
"allow-plugins": {
|
|
"php-http/discovery": true,
|
|
"symfony/flex": true,
|
|
"symfony/runtime": true
|
|
},
|
|
"bump-after-update": true,
|
|
"sort-packages": true,
|
|
"platform": {
|
|
"php": "8.5.0"
|
|
}
|
|
},
|
|
"autoload": {
|
|
"psr-4": {
|
|
"App\\": "src/"
|
|
}
|
|
},
|
|
"autoload-dev": {
|
|
"psr-4": {
|
|
"App\\Tests\\": "tests/"
|
|
}
|
|
},
|
|
"replace": {
|
|
"symfony/polyfill-ctype": "*",
|
|
"symfony/polyfill-iconv": "*",
|
|
"symfony/polyfill-php72": "*",
|
|
"symfony/polyfill-php73": "*",
|
|
"symfony/polyfill-php74": "*",
|
|
"symfony/polyfill-php80": "*",
|
|
"symfony/polyfill-php81": "*",
|
|
"symfony/polyfill-php82": "*"
|
|
},
|
|
"scripts": {
|
|
"auto-scripts": {
|
|
"cache:clear": "symfony-cmd",
|
|
"assets:install %PUBLIC_DIR%": "symfony-cmd"
|
|
},
|
|
"post-install-cmd": [
|
|
"@auto-scripts"
|
|
],
|
|
"post-update-cmd": [
|
|
"@auto-scripts"
|
|
]
|
|
},
|
|
"conflict": {
|
|
"symfony/symfony": "*"
|
|
},
|
|
"extra": {
|
|
"symfony": {
|
|
"allow-contrib": false,
|
|
"require": "8.1.*"
|
|
}
|
|
},
|
|
"require-dev": {
|
|
"friendsofphp/php-cs-fixer": "^3.95",
|
|
"phpstan/phpstan": "^2.1",
|
|
"phpunit/phpunit": "^13.2",
|
|
"symfony/browser-kit": "8.1.*",
|
|
"symfony/css-selector": "8.1.*"
|
|
}
|
|
}
|