- BREAKING: Replace
openid_connectandjson-jwtwithOmniauthOpenidFederation::OidcClient,AccessToken, andIdTokenbuilt onoauth2andjwt - BREAKING: Drop explicit
rackruntime dependency; load Rack federation endpoints viarequire "omniauth_openid_federation/rack" - BREAKING: Validate ID token
iss,aud, and sessionnonceincallback_phase - BREAKING: Fail closed on trust chain resolution errors instead of returning empty metadata
- BREAKING: Reject
alg: nonein access token JWT handling - BREAKING: Remove broad JWKS decode retry on non-signature errors
- BREAKING: Reject unknown
critclaims in entity statement validation - BREAKING: Enforce minimum RSA key size (2048 bits) in
Validators.validate_private_key! - Use
jwegem for JWE encrypt/decrypt instead ofjson-jwt - Refactor
OmniAuth::Strategies::OpenIDFederationinto concern modules underlib/omniauth_openid_federation/strategy/ - Add
OmniauthOpenidFederation::SecureComparefor constant-time string comparison in the strategy - Add
OmniauthOpenidFederation::JwtResponseDecoderfor encrypted/signed JWT userinfo and resource responses - Add behavioral contract specs for token exchange, userinfo, and JWE parity with former
openid_connectflow - Add Telia Tunnistus PP entity statement fixture and contract spec (A128GCM and A128CBC-HS256)
- Add provider-agnostic strategy options:
default_request_object_claims,required_request_object_claims,allowed_acr_values,require_entity_statement_fingerprint - Use
Jwe.encrypted?for JWE detection inAccessToken#resource_requestandTasksHelper - Deduplicate entity statement loading in
access_token.rbviaload_entity_statement_content - Verify subordinate entity statement signatures in trust chain resolution
- Wire
verify_sslintoHttpClientSSL options - Use
CacheAdapterinRateLimiterinstead ofRails.cachedirectly - Use issuer-scoped cache keys for federation JWKS and signed JWKS endpoints
- Fix OAuth callback failures in
callback_phaseto return the Rack response fromfail!instead ofnil; avoidsRack::ETagNoMethodErrorand HTTP 500 on auth failure - Fix flaky
test_local_endpointspec whenSSL_CERT_FILEis set in the environment - Replace internal
decode_id_tokenstubs in strategy specs with JWKS-backed setup - Add
HttpClient.postwith form data, headers, and connect/read timeouts - Retry GET requests on HTTP 429, 502, and 503; POST requests default to no retry
- Auto-configure SSL CA file when peer verification is enabled
- Route rake task HTTP through
HttpClientinstead of ad hocNet::HTTP
- Added
TimeHelpersmodule for compatibility with non-Rails environments - Replaced
Time.zoneusage withTimeHelpersto work with or without ActiveSupport
- Enhanced SSL configuration for HTTPS requests in tasks_helper.rb
- Updated federation controller to use ApplicationController
- Updated routes to have semaphore if it is already loaded
- Updated gemfiles and workflows for Rails 8 compatibility
- Improved time handling in integration and mock server classes using Time.zone.now
- Added
prepare_request_object_paramsproc option to customize request parameters before signing - Enhanced security validation for all user-provided parameters
- Improved
acr_valueshandling per OpenID Connect Core 1.0 specification
- Fix gemfile to include app and config directories
- Clean up Railtie loading patches to fully rely on Zeitwerk and autoloading
- Created
OmniauthOpenidFederation::Engineclass inheriting fromRails::Engine - Engine provides controllers via standard Rails autoloading mechanisms
- Routes are now defined in Engine's
config/routes.rbfile - Routes must now be mounted using
mount OmniauthOpenidFederation::Engine => "/"inconfig/routes.rb FederationEndpoint.mount_routesis still available for backward compatibility
- Enhanced instrumentation: All blocking exceptions automatically reported through instrumentation system, including OmniAuth middleware errors (like AuthenticityTokenProtection)
- CSRF protection instrumentation: New authenticity_error event type for reporting OmniAuth CSRF failures
- Comprehensive error reporting: Override fail! method in strategy to catch and instrument all authentication failures
- CSRF protection documentation: Added comprehensive Step 7 in README explaining CSRF protection configuration for both request and callback phases
- CSRF configuration examples: Added complete examples in examples/config/initializers/devise.rb.example and examples/app/controllers/users/omniauth_callbacks_controller.rb.example
- Deprecation warnings: Added runtime deprecation warnings for json_jwt method and ftn_spname option to guide users to recommended alternatives
- Code cleanup: Removed deprecated load_signing_key method (unused, returned nil)
- Updated deprecation notices: Fixed deprecation notices to reference correct replacement methods (request_object_params instead of non-existent provider_extension_params)
- Renamed option:
allow_authorize_params→request_object_paramsfor clarity (uses RFC 9101 terminology, clearly indicates params go into JWT request object)
- Initial public release, production-ready
- Full OpenID Federation 1.0 support with automatic entity statement validation and trust chain resolution
- Secure authentication with automatic signing of authorization requests
- ID token encryption and decryption support for enhanced security
- Secure client authentication without shared secrets
- Automatic provider key rotation handling for seamless key updates
- Built-in security features: rate limiting, path traversal protection, and error sanitization
- Production-ready with thread-safe configuration and intelligent retry logic
- Works with any OpenID Federation provider, supporting custom extension parameters
- Framework-agnostic: compatible with Rails, Sinatra, Rack, and other Rack-compatible frameworks
- Comprehensive management tools for entity statements and key management
- Enhanced developer experience with type signatures for better IDE support