ruby-on-rails devise ruby-on-rails-5 omniauth saml-2.0

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)