A secure WordPress authentication plugin that integrates Cloudflare Zero Trust OIDC (OpenID Connect) into your WordPress login system. Supports both SaaS and Self-hosted applications with enterprise-grade security features.
SAML Authentication Limitation: This plugin includes experimental SAML support that does NOT perform proper cryptographic signature validation. The SAML implementation should NOT be used in production environments as it is vulnerable to response tampering and replay attacks.
Recommendations:
- ✅ Use OIDC authentication (fully implemented and secure)
- ❌ Do not use SAML in production without additional security measures
- 📖 See
class-cfzt-saml.phpfor detailed security documentation
If SAML is absolutely required, consider using a production-ready SAML library like SimpleSAMLphp, LightSAML, or OneLogin PHP SAML.
- OIDC Integration: Seamless authentication using Cloudflare Zero Trust OpenID Connect ✅ Secure & Production-Ready
- SAML Support: Experimental SAML authentication
⚠️ Not production-ready (see security notice above) - Dual Application Support: Works with both SaaS and Self-hosted Cloudflare applications
- Flexible Login Modes:
- Secondary mode: Traditional WordPress login alongside Cloudflare login
- Primary mode: Cloudflare-only authentication (disables WordPress login)
- Automatic User Creation: Optionally create WordPress users on first login
- Role Assignment: Configure default roles for new users
- User Metadata: Stores Cloudflare identity information securely
- Encrypted Credentials: Client secrets encrypted using AES-256-CBC (when OpenSSL available)
- Environment Variables: Support for storing credentials outside the database
- Rate Limiting: Built-in protection against brute force attempts (10 attempts per 5 minutes)
- Session Protection: Enhanced session security with fingerprinting
- Security Headers: Automatic security headers on login pages (CSP, X-Frame-Options, etc.)
- Auto-Updates: GitHub-based update system - no manual downloads needed
- Clean Architecture: Well-organized, object-oriented codebase
- Hooks & Filters: Extensible with WordPress actions and filters
- Comprehensive Logging: Optional authentication event logging
- WordPress 5.0 or higher
- PHP 7.2 or higher
- A Cloudflare account with Zero Trust enabled
- SSL/HTTPS enabled on your WordPress site
- OpenSSL PHP extension (recommended for encryption)
- PHP DOM extension (required only if using SAML - not recommended for production)
- Download the latest release from the Releases page
- Upload to your
/wp-content/plugins/directory - Activate the plugin through the 'Plugins' menu in WordPress
cd wp-content/plugins/
git clone https://github.com/cjscrofani/cloudflare-zero-trust-wordpress.git cloudflare-zero-trust-login- Log in to your Cloudflare Zero Trust dashboard
- Navigate to Access → Applications
- Click Add an application
- Choose application type:
- SaaS (Recommended): For standard OIDC integration
- Self-hosted: For custom applications
- Configure the application:
- Application name: Your WordPress site name
- Session duration: As desired
- Application domain: Your WordPress URL
- Configure OIDC settings:
- Redirect URL:
https://yoursite.com/wp-login.php?cfzt_callback=1 - Grant type: Authorization code
- Scopes: openid, email, profile
- Redirect URL:
- Save and note your:
- Client ID
- Client Secret
- Team Domain (from Issuer URL, e.g.,
yourteam.cloudflareaccess.com)
- Go to Settings → CF Zero Trust in WordPress admin
- Enter your Cloudflare credentials:
- Team Domain: Your Cloudflare team domain
- Client ID: From Cloudflare application
- Client Secret: From Cloudflare application
- Configure options:
- Application Type: Match what you created in Cloudflare
- Login Mode: Secondary (both) or Primary (Cloudflare only)
- Auto-create Users: Enable to create users on first login
- Default Role: Role for new users
- Save settings
Add to your wp-config.php:
// Method 1: Direct constants
define('CFZT_CLIENT_ID', 'your-client-id-here');
define('CFZT_CLIENT_SECRET', 'your-client-secret-here');
// Method 2: Environment variables
define('CFZT_CLIENT_ID', getenv('CFZT_CLIENT_ID'));
define('CFZT_CLIENT_SECRET', getenv('CFZT_CLIENT_SECRET'));Or use .env file:
CFZT_CLIENT_ID=your-client-id-here
CFZT_CLIENT_SECRET=your-client-secret-here
- Navigate to your WordPress login page
- Click "Login with Cloudflare Zero Trust"
- Authenticate with your Cloudflare identity provider
- You'll be redirected back and logged into WordPress
- Monitor Authentication: Enable logging to track login attempts
- User Management: View Cloudflare-authenticated users via user meta
cfzt_user - Access Control: Use Cloudflare policies to control who can access your site
- Use OIDC, not SAML: The OIDC implementation is production-ready and secure. SAML is experimental only.
- Always use HTTPS for your WordPress site
- Keep WordPress salts configured properly in
wp-config.php(affects encryption) - Use environment variables for credentials when possible (see Step 3 in Configuration)
- Regularly update the plugin for security patches via the built-in GitHub updater
- Monitor authentication logs for suspicious activity (enable in settings)
- Implement IP restrictions in Cloudflare Zero Trust policies for additional security
- Use strong authentication in your Cloudflare identity provider (MFA recommended)
cloudflare-zero-trust-login/
├── assets/
│ └── css/
│ └── cfzt-login.css
├── includes/
│ ├── class-cfzt-admin.php
│ ├── class-cfzt-auth.php
│ ├── class-cfzt-login-ui.php
│ ├── class-cfzt-plugin.php
│ ├── class-cfzt-security.php
│ └── class-github-updater.php
├── templates/
│ ├── admin-page.php
│ └── login-button.php
├── cloudflare-zero-trust-login.php
└── uninstall.php
cfzt_user_authenticated- Fired after successful authenticationcfzt_user_created- Fired after new user creationcfzt_authentication_attempt- Fired on any authentication attempt
cfzt_default_role- Modify default role for new userscfzt_user_data- Modify user data before creation
Login button not appearing
- Verify Team Domain and Client ID are configured
- Check browser console for JavaScript errors
Authentication fails
- Ensure redirect URL matches exactly in Cloudflare
- Verify Client Secret is correct
- Check WordPress error logs with logging enabled
Users cannot be created
- Enable "Auto-create Users" in settings
- Verify default role is valid
- Check user email isn't already registered
Rate limit errors
- Wait 5 minutes before trying again
- Check for automated/bot login attempts
Add to wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Then enable authentication logging in plugin settings.
This project is licensed under the GPL v2 or later - see the LICENSE file for details.