Add OIDC section for sign in and sign up page

- name: :oidc → Identifier for this login provider in the app.
- scope: [:openid, :email, :profile] → Tells the provider we want the user’s ID (openid), their email, and basic profile info (name, picture, etc.).
- response_type: :code → Uses Authorization Code Flow, which is more secure because tokens are not exposed in the URL.
- issuer: Rails.application.secrets.oidc_issuer → The base URL of the OIDC provider (e.g., Auth0). Used to find its config.
- discovery: true → Automatically fetches the provider’s endpoints from its discovery document instead of manually setting them.
- client_auth_method: :basic → Sends client ID and secret using HTTP Basic Auth when exchanging the code for tokens.

Add system tests for OIDC Auth

Edit the oauth docs to support OIDC auth
This commit is contained in:
Anamika Aggarwal
2025-08-07 05:31:13 +00:00
committed by Javi Martín
parent eab5f52e19
commit 5e263baed2
17 changed files with 390 additions and 6 deletions

View File

@@ -1393,7 +1393,8 @@ table {
.button.button-facebook,
.button.button-google,
.button.button-wordpress,
.button.button-saml {
.button.button-saml,
.button.button-oidc {
color: inherit;
font-weight: bold;
@@ -1453,6 +1454,16 @@ table {
}
}
.button.button-oidc {
@include has-fa-icon(openid, brands);
background: #fdf9f1;
border-left: 3px solid #f7931e;
&::before {
color: #f7931e;
}
}
// 14. Verification
// ----------------

View File

@@ -4,6 +4,7 @@ class Admin::Settings::FeaturesTabComponent < ApplicationComponent
feature.featured_proposals
feature.facebook_login
feature.google_login
feature.oidc_login
feature.saml_login
feature.twitter_login
feature.wordpress_login

View File

@@ -17,7 +17,8 @@ class Devise::OmniauthFormComponent < ApplicationComponent
(:facebook if feature?(:facebook_login)),
(:google_oauth2 if feature?(:google_login)),
(:wordpress_oauth2 if feature?(:wordpress_login)),
(:saml if feature?(:saml_login))
(:saml if feature?(:saml_login)),
(:oidc if feature?(:oidc_login))
].compact
end
end

View File

@@ -21,6 +21,10 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
sign_in_with :saml_login, :saml
end
def oidc
sign_in_with :oidc_login, :oidc
end
def after_sign_in_path_for(resource)
if resource.registering_with_oauth
finish_signup_path

View File

@@ -21,6 +21,11 @@ module OmniauthTenantSetup
secrets.saml_idp_metadata_url, secrets.saml_idp_sso_service_url)
end
def oidc(env)
oidc_auth(env, secrets.oidc_client_id,
secrets.oidc_client_secret, secrets.oidc_issuer, secrets.oidc_redirect_uri)
end
private
def oauth(env, key, secret)
@@ -55,6 +60,17 @@ module OmniauthTenantSetup
end
end
def oidc_auth(env, client_id, client_secret, issuer, redirect_uri)
unless Tenant.default?
strategy = env["omniauth.strategy"]
strategy.options[:client_id] = client_id if client_id.present?
strategy.options[:client_secret] = client_secret if client_secret.present?
strategy.options[:issuer] = issuer if issuer.present?
strategy.options[:redirect_uri] = redirect_uri if redirect_uri.present?
end
end
def secrets
Tenant.current_secrets
end

View File

@@ -85,6 +85,7 @@ class Setting < ApplicationRecord
"feature.remote_census": nil,
"feature.valuation_comment_notification": true,
"feature.graphql_api": true,
"feature.oidc_login": false,
"feature.saml_login": false,
"feature.sdg": true,
"feature.machine_learning": false,