ruby on rails - Configuración de devolución de llamada SAML en Rails utilizando Devise y OmniAuth-SAML
ruby-on-rails ruby-on-rails-5 (1)
EDIT: información adicional y pregunta condensada cerca de la parte inferior;)
Estoy configurando la integración entre una pequeña aplicación que estoy creando y un proveedor de identidad que usa SAML2.0.
En general, he estado siguiendo las instrucciones en la página Devise, y luego en los documentos de Omniauth-SAML.
El problema parece ser que actualmente no se ha generado ninguna ruta de devolución de llamada. Aquí están los bits de código relevantes a continuación; no dude en solicitar información adicional.
app / models / user.rb
class User < ActiveRecord::Base
devise :omniauthable, omniauth_providers: [:saml]
def from_omniauth(auth_hash)
puts auth_hash
new # Stub for now I guess?
end
end
app / controllers / omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def saml
@user = User.from_omniauth request.env[''omniauth.auth'']
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: ''SAML'') if is_navicational_format?
else
session[''devise.saml_data''] = request.env[''omniauth.auth'']
redirect_to permission_denied # this isn''t going to work lol
end
end
def failure
redirect_to root_path
end
end
Un fragmento truncado y desinfectado de config / initializers / devise.rb
config.omniauth :saml,
idp_cert_fingerprint: ''aa:bb:cc...'', # an actual fingerprint here
idp_sso_target_url: ''https://sso.bla.thing.com/fss/idp/startSSO.ping?PartnerSpId=SAML_UID'',
issuer: ''myidpname'', # Not actually sure what this should be
idp_entity_id: ''thingfssdp'',
assertion_consumer_service_url: ''https://myapp.com/auth/saml/callback'',
name_identifier_format: ''urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress''
De acuerdo con los documentos aquí y aquí , agregar más que lo anterior (es decir, poner los requisitos adicionales en config / initializers / omniauth.rb) sería incorrecto.
Mis controladores tienen before_action :authenticate_user!
como su primera línea.
config / routes.rb tiene la siguiente línea en la parte superior:
Rails.application.routes.draw do
devise_for :users, controllers: { omniauth_callbacks: ''users/omniauth_callbacks'' }
Pero posiblemente sea importante tener en cuenta que no he agregado manualmente ninguna lógica para el manejo de devolución de llamada aún
Intentar visitar mi aplicación produce un ERR_TOO_MANY_REDIRECTS; bastantes 302s, todos aparentemente apuntando hacia atrás. Hacer un GET / auth / saml / devolución de llamada produce el siguiente error útil (no estoy seguro de cómo o por qué / users / se antepone allí, ¿necesito solicitar un cambio en la URL de ACS o es algo de lo que tengo control?):
Cualquier idea o asistencia sería muy apreciada.
EDITAR: Parece que el problema es que user_saml_omniauth_authorize_path
se está configurando en / users / auth / saml, y no directamente en la página de inicio de sesión de IDP. No tengo un controlador explícito para esta ruta, pero al parecer requerir el inicio de sesión para OTROS controladores significa que estoy requiriendo iniciar sesión para este. El resultado final es que, como algunos han sugerido, obtenemos un bucle de redirección infinito.
Acerca del bucle de redireccionamiento: ya que tiene before_action :authenticate_user!
conduce cualquier solicitud no autenticada a la página de inicio de sesión de los usuarios. Supongo que también tiene la misma devolución de llamada en su página de inicio de sesión. Por lo tanto, en cada redirección a /sign_in
rails lo pasa a través de este authenticate_user!
y lo redirige nuevamente ya que el usuario no está autenticado. Para que funcione correctamente, tienes que skip_before_action :authenticate_user!
en el controlador donde tienes el inicio de sesión (SessionsController supongo).
En cuanto a su segunda pregunta, la ruta de autorización correcta. la respuesta está en la captura de pantalla que presentó, debajo del error. Puedes ver que la ruta correcta es /users/auth/saml
y users/auth/saml/callback
ACTUALIZACIÓN: los usuarios se anexan por defecto de Devise (utilizando el nombre de su modelo ideado)