mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							222 lines
						
					
					
						
							7.5 KiB
						
					
					
				
			
		
		
	
	
							222 lines
						
					
					
						
							7.5 KiB
						
					
					
				| # DocuSeal Omniauth Implementation Guide
 | |
| 
 | |
| This document describes the complete implementation of omniauth/SSO functionality in DocuSeal, restoring the features that were previously gated behind paywall checks.
 | |
| 
 | |
| ## Overview
 | |
| 
 | |
| We have successfully implemented comprehensive omniauth support with the following providers:
 | |
| - **SAML 2.0** - For enterprise SSO integration
 | |
| - **Google OAuth2** - For Google account authentication  
 | |
| - **Microsoft Graph** - For Microsoft/Office 365 authentication
 | |
| 
 | |
| ## What Was Implemented
 | |
| 
 | |
| ### 1. Database Schema Changes
 | |
| - Added `provider` and `uid` columns to the `users` table
 | |
| - Created migration: `db/migrate/20250719104801_add_omniauth_to_users.rb`
 | |
| - Added unique index on `[provider, uid]` combination
 | |
| 
 | |
| ### 2. User Model Updates
 | |
| - Added `:omniauthable` to Devise modules
 | |
| - Configured omniauth providers: `%i[saml google_oauth2 microsoft_graph]`
 | |
| - Implemented `User.from_omniauth(auth)` class method for handling authentication callbacks
 | |
| - Added support for both single-tenant and multi-tenant account creation
 | |
| 
 | |
| ### 3. Devise Configuration
 | |
| - Updated `config/initializers/devise.rb` with omniauth provider configurations
 | |
| - Added environment variable-based configuration for SAML
 | |
| - Configured Google OAuth2 and Microsoft Graph providers
 | |
| - Added proper attribute mapping for SAML assertions
 | |
| 
 | |
| ### 4. Controllers
 | |
| - Created `app/controllers/users/omniauth_callbacks_controller.rb`
 | |
| - Handles callbacks for all three providers (SAML, Google, Microsoft)
 | |
| - Includes proper error handling and session management
 | |
| - Updated `app/controllers/sso_settings_controller.rb` with configuration management
 | |
| 
 | |
| ### 5. Views and UI
 | |
| - Replaced SSO paywall placeholder with functional SAML configuration form
 | |
| - Updated login form to include all three authentication providers
 | |
| - Added SSO settings interface for SAML configuration
 | |
| - Removed `Docuseal.multitenant?` checks that were gating SSO features
 | |
| 
 | |
| ### 6. Routes
 | |
| - Updated routes to include omniauth callbacks
 | |
| - Added update action to SSO settings controller
 | |
| - Enabled SSO settings for all users (removed paywall restrictions)
 | |
| 
 | |
| ### 7. Gemfile Dependencies
 | |
| Added the following gems:
 | |
| ```ruby
 | |
| gem 'omniauth'
 | |
| gem 'omniauth-rails_csrf_protection'
 | |
| gem 'omniauth-saml'
 | |
| gem 'omniauth-google-oauth2'
 | |
| gem 'omniauth-microsoft_graph'
 | |
| ```
 | |
| 
 | |
| ### 8. Development Environment
 | |
| - Created `Dockerfile.dev` for development with mounted codebase
 | |
| - Created `docker-compose.dev.yml` for local development environment
 | |
| - Configured development environment with PostgreSQL and Redis
 | |
| 
 | |
| ## Configuration
 | |
| 
 | |
| ### SAML Configuration
 | |
| 
 | |
| #### Environment Variables
 | |
| Set these environment variables for SAML configuration:
 | |
| ```bash
 | |
| SAML_IDP_SSO_SERVICE_URL=https://your-idp.com/sso/saml
 | |
| SAML_IDP_CERT_FINGERPRINT=AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD
 | |
| SAML_SP_ENTITY_ID=docuseal
 | |
| APP_URL=http://localhost:3000
 | |
| ```
 | |
| 
 | |
| #### Database Configuration
 | |
| Alternatively, configure SAML through the web interface at `/settings/sso` which stores encrypted configuration in the database.
 | |
| 
 | |
| #### Service Provider URLs
 | |
| Provide these URLs to your Identity Provider:
 | |
| - **Assertion Consumer Service URL**: `http://localhost:3000/users/auth/saml/callback`
 | |
| - **SP Metadata URL**: `http://localhost:3000/users/auth/saml/metadata`
 | |
| - **SP Entity ID**: `docuseal` (or your custom value)
 | |
| 
 | |
| ### Google OAuth2 Configuration
 | |
| 
 | |
| Add to Rails credentials or environment variables:
 | |
| ```bash
 | |
| GOOGLE_CLIENT_ID=your-google-client-id
 | |
| GOOGLE_CLIENT_SECRET=your-google-client-secret
 | |
| ```
 | |
| 
 | |
| ### Microsoft Graph Configuration
 | |
| 
 | |
| Add to Rails credentials or environment variables:
 | |
| ```bash
 | |
| MICROSOFT_CLIENT_ID=your-microsoft-client-id
 | |
| MICROSOFT_CLIENT_SECRET=your-microsoft-client-secret
 | |
| ```
 | |
| 
 | |
| ## Usage
 | |
| 
 | |
| ### For Users
 | |
| 1. Navigate to the login page
 | |
| 2. Choose from available authentication methods:
 | |
|    - Sign in with Google
 | |
|    - Sign in with Microsoft
 | |
|    - Sign in with SAML SSO (if configured)
 | |
| 3. Complete authentication with your chosen provider
 | |
| 4. You'll be automatically signed in or prompted to complete registration
 | |
| 
 | |
| ### For Administrators
 | |
| 1. Go to Settings → SSO
 | |
| 2. Configure SAML settings with your Identity Provider details
 | |
| 3. Test the configuration using the "Test SAML Login" button
 | |
| 4. Users can now authenticate using the configured SSO provider
 | |
| 
 | |
| ## Development Setup
 | |
| 
 | |
| ### Using Docker (Recommended)
 | |
| ```bash
 | |
| # Build the development environment
 | |
| docker-compose -f docker-compose.dev.yml build
 | |
| 
 | |
| # Start the development environment
 | |
| docker-compose -f docker-compose.dev.yml up
 | |
| 
 | |
| # Access the application at http://localhost:3000
 | |
| ```
 | |
| 
 | |
| ### Local Development
 | |
| ```bash
 | |
| # Install dependencies
 | |
| bundle install
 | |
| yarn install
 | |
| 
 | |
| # Run database migrations
 | |
| rails db:create db:migrate
 | |
| 
 | |
| # Start the development server
 | |
| rails server
 | |
| ```
 | |
| 
 | |
| ## Testing
 | |
| 
 | |
| ### SAML Testing
 | |
| 1. Set up environment variables for SAML configuration
 | |
| 2. Navigate to `/settings/sso` to configure SAML
 | |
| 3. Use the "Test SAML Login" button to verify configuration
 | |
| 4. Check logs for any authentication errors
 | |
| 
 | |
| ### OAuth Testing
 | |
| 1. Configure Google/Microsoft credentials
 | |
| 2. Navigate to login page
 | |
| 3. Click "Sign in with Google" or "Sign in with Microsoft"
 | |
| 4. Complete OAuth flow and verify user creation/authentication
 | |
| 
 | |
| ## Security Considerations
 | |
| 
 | |
| 1. **CSRF Protection**: Implemented via `omniauth-rails_csrf_protection` gem
 | |
| 2. **Secure Credentials**: Store sensitive configuration in Rails credentials or environment variables
 | |
| 3. **Certificate Validation**: SAML certificate fingerprints are validated
 | |
| 4. **Session Management**: Proper session cleanup and management implemented
 | |
| 
 | |
| ## Troubleshooting
 | |
| 
 | |
| ### Common Issues
 | |
| 
 | |
| 1. **"NameError: uninitialized constant EncryptedConfig"**
 | |
|    - This was resolved by moving SAML configuration to environment variables
 | |
|    - Ensure proper initialization order in Devise configuration
 | |
| 
 | |
| 2. **"Invalid credentials" errors**
 | |
|    - Verify OAuth client IDs and secrets are correct
 | |
|    - Check redirect URIs match exactly
 | |
| 
 | |
| 3. **SAML authentication failures**
 | |
|    - Verify IdP certificate fingerprint is correct
 | |
|    - Check that assertion consumer service URL matches
 | |
|    - Ensure name identifier format matches IdP configuration
 | |
| 
 | |
| ### Logs
 | |
| Check application logs for detailed error messages:
 | |
| ```bash
 | |
| docker-compose -f docker-compose.dev.yml logs app
 | |
| ```
 | |
| 
 | |
| ## Files Modified/Created
 | |
| 
 | |
| ### New Files
 | |
| - `db/migrate/20250719104801_add_omniauth_to_users.rb`
 | |
| - `app/controllers/users/omniauth_callbacks_controller.rb`
 | |
| - `app/views/sso_settings/_saml_form.html.erb`
 | |
| - `Dockerfile.dev`
 | |
| - `docker-compose.dev.yml`
 | |
| - `OMNIAUTH_IMPLEMENTATION.md`
 | |
| 
 | |
| ### Modified Files
 | |
| - `Gemfile` - Added omniauth gems
 | |
| - `app/models/user.rb` - Added omniauthable and from_omniauth method
 | |
| - `config/initializers/devise.rb` - Added omniauth provider configurations
 | |
| - `app/controllers/sso_settings_controller.rb` - Added update method
 | |
| - `app/views/sso_settings/index.html.erb` - Replaced placeholder with form
 | |
| - `app/views/devise/sessions/new.html.erb` - Added omniauth provider buttons
 | |
| - `app/views/shared/_settings_nav.html.erb` - Removed paywall check
 | |
| - `config/routes.rb` - Added update route for SSO settings
 | |
| 
 | |
| ## Next Steps
 | |
| 
 | |
| 1. **Production Deployment**: Configure production environment variables
 | |
| 2. **Additional Providers**: Add more omniauth providers as needed
 | |
| 3. **Advanced SAML**: Implement IdP-initiated SSO and SLO (Single Logout)
 | |
| 4. **User Management**: Add admin interface for managing SSO users
 | |
| 5. **Audit Logging**: Add logging for SSO authentication events
 | |
| 
 | |
| ## Support
 | |
| 
 | |
| For issues or questions about this implementation, refer to:
 | |
| - [Devise Omniauth Documentation](https://github.com/heartcombo/devise/wiki/OmniAuth:-Overview)
 | |
| - [Omniauth SAML Documentation](https://github.com/omniauth/omniauth-saml)
 | |
| - DocuSeal application logs and error messages
 |