wp-m365-login/.github/assets/button-preview.svg
friloo 1202283eda
Add Entra group restriction, button-only mode and detailed README
Groups: a Graph-backed picker on the Security tab (search by name or
paste object IDs) stores allowed group IDs. During sign-in membership is
read from the ID token's groups claim when present, otherwise verified
through Microsoft Graph checkMemberGroups (transitive). Verification
failures refuse the sign-in.

Button-only mode: hides the password form and the lost-password link
and rejects password sign-ins on wp-login.php via the authenticate
filter. A generated, rate-limited fallback key re-enables the form for
30 minutes per browser; M365_LOGIN_DISABLE_BUTTON_ONLY switches the
mode off from wp-config.php.

Also: new German-language README with sequence diagram, settings
reference, troubleshooting and hook examples; readme.txt external
services section now covers Microsoft Graph; translations updated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJxAHYdMfKPoN4koRc4Ci2
2026-09-22 14:30:53 +00:00

64 lines
4.3 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="720" height="300" viewBox="0 0 720 300" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#f6f7f7"/>
<stop offset="1" stop-color="#e9edf2"/>
</linearGradient>
<filter id="shadow" x="-10%" y="-10%" width="120%" height="130%">
<feDropShadow dx="0" dy="6" stdDeviation="10" flood-color="#0b1d33" flood-opacity="0.12"/>
</filter>
</defs>
<rect width="720" height="300" rx="20" fill="url(#bg)"/>
<!-- Login card -->
<g transform="translate(200 34)" filter="url(#shadow)">
<rect width="320" height="232" rx="6" fill="#fff" stroke="#c3c4c7"/>
<!-- fake fields -->
<text x="24" y="38" font-size="13" fill="#3c434a">Benutzername oder E-Mail-Adresse</text>
<rect x="24" y="48" width="272" height="34" rx="4" fill="#fff" stroke="#8c8f94"/>
<text x="24" y="108" font-size="13" fill="#3c434a">Passwort</text>
<rect x="24" y="118" width="272" height="34" rx="4" fill="#fff" stroke="#8c8f94"/>
<!-- divider -->
<line x1="24" y1="180" x2="296" y2="180" stroke="#dcdcde"/>
<rect x="140" y="171" width="40" height="18" fill="#fff"/>
<text x="160" y="184" font-size="12" fill="#646970" text-anchor="middle">oder</text>
<!-- Microsoft button -->
<rect x="24" y="196" width="272" height="44" rx="4" fill="#2f2f2f"/>
<g transform="translate(70 206)">
<rect width="24" height="24" rx="2" fill="#fff"/>
<rect x="4" y="4" width="7" height="7" fill="#f25022"/>
<rect x="13" y="4" width="7" height="7" fill="#7fba00"/>
<rect x="4" y="13" width="7" height="7" fill="#00a4ef"/>
<rect x="13" y="13" width="7" height="7" fill="#ffb900"/>
</g>
<text x="180" y="223" font-size="15" font-weight="600" fill="#fff" text-anchor="middle">Login mit Microsoft</text>
</g>
<!-- Colour swatches -->
<g transform="translate(40 60)">
<text x="0" y="0" font-size="12" fill="#646970" font-weight="600">PRESETS</text>
<g transform="translate(0 16)">
<rect width="120" height="34" rx="17" fill="#2f2f2f"/><text x="60" y="22" font-size="12" fill="#fff" text-anchor="middle" font-weight="600">Microsoft dark</text>
</g>
<g transform="translate(0 60)">
<rect width="120" height="34" rx="17" fill="#fff" stroke="#8c8c8c"/><text x="60" y="22" font-size="12" fill="#5e5e5e" text-anchor="middle" font-weight="600">Microsoft light</text>
</g>
<g transform="translate(0 104)">
<rect width="120" height="34" rx="17" fill="#0078d4"/><text x="60" y="22" font-size="12" fill="#fff" text-anchor="middle" font-weight="600">Azure blue</text>
</g>
<g transform="translate(0 148)">
<rect width="120" height="34" rx="17" fill="#2271b1"/><text x="60" y="22" font-size="12" fill="#fff" text-anchor="middle" font-weight="600">WordPress blue</text>
</g>
</g>
<!-- Right: security badges -->
<g transform="translate(560 60)" font-size="12" fill="#1d2327">
<text x="0" y="0" font-size="12" fill="#646970" font-weight="600">SICHERHEIT</text>
<g transform="translate(0 16)"><circle cx="8" cy="8" r="8" fill="#1e6b31"/><path d="M4.5 8.5l2.5 2.5 4.5-5" fill="none" stroke="#fff" stroke-width="2"/><text x="24" y="12">PKCE (S256)</text></g>
<g transform="translate(0 44)"><circle cx="8" cy="8" r="8" fill="#1e6b31"/><path d="M4.5 8.5l2.5 2.5 4.5-5" fill="none" stroke="#fff" stroke-width="2"/><text x="24" y="12">State + Nonce</text></g>
<g transform="translate(0 72)"><circle cx="8" cy="8" r="8" fill="#1e6b31"/><path d="M4.5 8.5l2.5 2.5 4.5-5" fill="none" stroke="#fff" stroke-width="2"/><text x="24" y="12">JWKS-Signatur</text></g>
<g transform="translate(0 100)"><circle cx="8" cy="8" r="8" fill="#1e6b31"/><path d="M4.5 8.5l2.5 2.5 4.5-5" fill="none" stroke="#fff" stroke-width="2"/><text x="24" y="12">Tenant-Pinning</text></g>
<g transform="translate(0 128)"><circle cx="8" cy="8" r="8" fill="#1e6b31"/><path d="M4.5 8.5l2.5 2.5 4.5-5" fill="none" stroke="#fff" stroke-width="2"/><text x="24" y="12">Secret verschlüsselt</text></g>
<g transform="translate(0 156)"><circle cx="8" cy="8" r="8" fill="#1e6b31"/><path d="M4.5 8.5l2.5 2.5 4.5-5" fill="none" stroke="#fff" stroke-width="2"/><text x="24" y="12">Gruppen-Check</text></g>
</g>
</svg>