a p*_*a p 11 ruby-on-rails devise omniauth saml-2.0 ruby-on-rails-5
编辑:附近的附加信息和浓缩问题;)
我正在使用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
Run Code Online (Sandbox Code Playgroud)
应用程序/控制器/ 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
Run Code Online (Sandbox Code Playgroud)
来自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'
Run Code Online (Sandbox Code Playgroud)
根据这里和这里的文档,添加超过上面的内容(即将额外的需求放入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' }
Run Code Online (Sandbox Code Playgroud)
但值得注意的是,我还没有手动为回调处理添加任何逻辑
试图访问我的应用程序会产生ERR_TOO_MANY_REDIRECTS; 相当多的302s显然都指向了自己.做一个GET /认证/ SAML /回调产生以下帮助的错误(不知道如何或为何/用户/被前置那里,我需要请求在ACS URL的变化或者这事我管了?):
任何见解或帮助将不胜感激.
编辑:看起来问题是user_saml_omniauth_authorize_path设置为/ users/auth/saml - 而不是直接设置IDP登录页面.我没有明确的控制器用于此路由,但显然需要登录OTHER控制器意味着我需要登录此路由器.最终的结果是,正如一些人所建议的那样,我们得到了一个无限的重定向循环.
关于重定向循环:因为您有before_action :authenticate_user!任何未经身份验证的请求导致用户登录页面.我的猜测是你在登录页面上也有相同的回调.因此,每次重定向到/sign_inrails都会通过它authenticate_user!重定向它,因为用户未经过身份验证.为了使它正常工作,你必须skip_before_action :authenticate_user!在你有登录的控制器(SessionsController我认为).
至于你的第二个问题 - 正确的授权路线.答案在您提供的屏幕截图中,位于错误下方.你可以看到正确的路径是/users/auth/saml和users/auth/saml/callback
更新:默认情况下,用户会从Devise获取(使用您设计的模型名称)
| 归档时间: |
|
| 查看次数: |
684 次 |
| 最近记录: |