ruby on rails - Devise और OmniAuth-SAML का उपयोग कर रेल में SAML कॉलबैक की स्थापना करना



ruby-on-rails ruby-on-rails-5 (1)

संपादित करें: नीचे के पास अतिरिक्त जानकारी और संक्षिप्त सवाल;)

मैं एक छोटी सी ऐप जो मैं बना रहा हूं और SAML2.0 का उपयोग कर एक पहचान प्रदाता के बीच एकीकरण की स्थापना कर रहा हूं।

सामान्य तौर पर, मैं Devise पृष्ठ पर दिए गए निर्देशों का पालन कर रहा हूं, और फिर Omniauth-SAML दस्तावेज़ पर।

यह मुद्दा वर्तमान में ऐसा लगता है कि कोई कॉलबैक पथ उत्पन्न नहीं हुआ है। यहाँ नीचे प्रासंगिक कोड बिट्स है; अतिरिक्त जानकारी का अनुरोध करने के लिए स्वतंत्र महसूस करें

एप्लिकेशन / मॉडल / 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

एप्लिकेशन / नियंत्रक / 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

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'

यहां और यहां के दस्तावेज़ों के अनुसार, उपरोक्त (जो कि config / initializers / omniauth.rb में अतिरिक्त आवश्यकताएं डाल रहा है) से अधिक जोड़ना गलत होगा।

मेरे नियंत्रकों से before_action :authenticate_user! अपनी पहली पंक्ति के रूप में

config / routes.rb पर निम्न पंक्ति है:

Rails.application.routes.draw do
  devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }

लेकिन यह संभवतः महत्वपूर्ण है कि मैंने नोटबुक को अभी तक कॉलबैक से निपटने के लिए कोई तर्क नहीं जोड़ा है

मेरे ऐप की यात्रा करने का प्रयास करना एक ERR_TOO_MANY_REDIRECTS पैदा करता है; काफी कुछ 302 सभी जाहिरा तौर पर खुद को वापस ओर इशारा करते हुए। एक GET / auth / saml / callback करना निम्नलिखित सहायक त्रुटि पैदा करता है (सुनिश्चित नहीं है कि कैसे / क्यों / उपयोगकर्ता / वहां प्रीपेड हो गए हैं, क्या मुझे एसीएस यूआरएल में बदलाव के लिए अनुरोध करने की ज़रूरत है या क्या यह मेरा नियंत्रण है?):

कोई अंतर्दृष्टि या सहायता की बहुत सराहना की जाएगी

संपादित करें: ऐसा लगता है कि यह मुद्दा यह है कि user_saml_omniauth_authorize_path को / users / auth / saml पर सेट किया जा रहा है - और सीधे आईडीपी साइनइन पृष्ठ नहीं। मेरे पास इस मार्ग के लिए कोई स्पष्ट नियंत्रक नहीं है, लेकिन जाहिरा तौर पर दूसरे नियंत्रकों के लिए साइनइन की आवश्यकता है, इसका मतलब है कि मुझे इस एक के लिए साइनइन की आवश्यकता है अंतिम परिणाम यह है कि, जैसा कि कुछ ने सुझाव दिया है, हमें एक असीमित रीडायरेक्ट लूप मिलता है।


रीडायरेक्ट लूप के बारे में: चूंकि आपके पास before_action :authenticate_user! यह उपयोगकर्ताओं को साइन-इन पेज पर किसी भी गैर-अधिकृत अनुरोध की ओर ले जाता है मेरा अनुमान है कि आपके साइन इन पेज पर आपके पास एक ही कॉलबैक है। इस प्रकार प्रत्येक रीडायरेक्ट पर /sign_in रेल पर इस authenticate_user! माध्यम से डालता है authenticate_user! और उपयोगकर्ता को प्रमाणित नहीं होने के बाद से इसे फिर से पुनर्निर्देशित करता है। इसे सही तरीके से काम करने के लिए आपको skip_before_action :authenticate_user! करना skip_before_action :authenticate_user! नियंत्रक में जहां आपके पास हस्ताक्षर हैं (सत्र नियंत्रक I का अनुमान है)।

आपके दूसरे प्रश्न के लिए - सही प्राधिकरण मार्ग जवाब आपके द्वारा प्रस्तुत स्क्रीनशॉट में है, त्रुटि के नीचे। आप वहां देख सकते हैं कि सही पथ है /users/auth/saml और users/auth/saml/callback

अद्यतन: उपयोगकर्ता डिवाइसेज़ से डिफ़ॉल्ट रूप से प्रीपेड हो जाता है (अपने डिविसबल मॉडल नाम का उपयोग करके)