Rails应用中集成ruby-saml实现SAML认证的流程与配置咨询
SAML认证流程实现步骤
你当前的场景中,你的站点abc.com属于SAML体系里的服务提供商(SP),xyz.com属于身份提供商(IdP),按以下步骤实现即可:
- 给abc.com的功能按钮绑定路由,指向你提供的
init接口即可,ruby-saml库已经自动封装了SAML请求的生成逻辑,request.create(saml_settings)会自动生成合规的SAML请求参数,调用redirect_to就会自动携带参数跳转到IdP的SSO接口,不需要你手动拼接SAML XML。如果xyz.com要求用POST方式提交SAML请求而非跳转,把redirect_to(request.create(saml_settings))换成渲染request.create(saml_settings, :post)返回的自动提交表单即可。 - 提前将你的SP相关配置信息(SP实体ID、ACS地址等)提供给xyz.com的运维人员,在IdP侧完成SP信任配置,否则IdP会直接拒绝你的SAML请求。
- 编写SAML响应消费接口,对应你配置的
assertion_consumer_service_url的路由,参考代码如下:
def consume # 传入IdP返回的SAMLResponse和配置项初始化响应对象 response = OneLogin::RubySaml::Response.new(params[:SAMLResponse], settings: saml_settings) # 校验响应合法性(签名、有效期、来源等) if response.is_valid? # 校验通过后可从response中取用户信息:response.name_id为你配置的邮箱,response.attributes可以取IdP返回的其他扩展用户字段 # 此处编写你的业务逻辑:比如创建/登录用户、绑定账号、跳转到业务页等 redirect_to business_page_path, notice: "认证成功" else # 校验失败处理逻辑 redirect_to root_path, alert: "认证失败:#{response.errors.join('、')}" end end
- 在你的
saml_settings方法中补全必填的settings.sp_entity_id配置项,你当前提供的示例代码中缺少这个必填字段。
配置字段含义说明
- settings.assertion_consumer_service_url:简称ACS地址,是SP端接收IdP返回的SAML认证响应的公网可访问接口地址,也就是你上面写的
consume接口的访问地址,这个地址必须提前告知IdP侧备案,IdP认证完成后会将响应提交到这个地址。 - settings.sp_entity_id:SP(你的abc.com站点)的唯一标识,通常可以用站点域名或任意全局唯一字符串,该值必须和你在IdP侧备案的SP实体ID完全一致,否则IdP会拒绝你的认证请求。
- settings.idp_entity_id:IdP(xyz.com站点)的唯一标识,该值由xyz.com的运维人员提供给你,用于校验返回的SAML响应确实是你对接的IdP签发的。
- settings.idp_sso_service_url:IdP提供的单点登录接口地址,也就是你提到的xyz.com/SAML,ruby-saml生成认证请求后会跳转/提交到这个地址,该值由xyz.com的运维人员提供。
- settings.idp_slo_service_url:IdP提供的单点登出接口地址,如果你需要实现单点登出能力(用户在你的站点登出后,同步在IdP和所有关联的SP站点登出)才需要配置,不需要单点登出可以忽略,该值由xyz.com的运维人员提供。
内容的提问来源于stack exchange,提问作者Aniket Tiwari
相关产品推荐
相关产品推荐

