You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义PHP SAML认证请求无法通过Google Workspace IDP验证求助

排查Google Workspace拒绝自定义SAML认证请求的问题

我试过SimpleSamlPHP、saml_tools、onelogin_saml这些SAML库,都太复杂,一堆可选配置没必要,所以自己基于需求定制了SAML库,参考相关代码在应用里实现起来很简单,但用Google Workspace当IDP测试时,生成的XML始终不被接受。

已完成Google Workspace基础配置:添加了ACS和EntityID信息,开放所有用户对该SP的访问权限。

我的PHP认证请求生成代码

$xmlstr = '<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
            xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
            ID="' . $idnumber . '" 
            Version="2.0" 
            ProviderName="' . $sp_meta . '" 
            IssueInstant="' . date('Y-m-d\TH:i:s\Z') . '" 
            Destination="' . $idp_sso_url . '" 
            ProtocolBinding="' . $authn_request_binding . '" 
            AssertionConsumerServiceURL="' . $sp_acs_url . '">
    <saml:Issuer>' . $sp_entity_id . '</saml:Issuer>
    <samlp:NameIDPolicy Format="' . $name_id_format . '" AllowCreate="true"/>
    <samlp:RequestedAuthnContext Comparison="exact">
        <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
    </samlp:RequestedAuthnContext>
    </samlp:AuthnRequest>';


$doc = new DOMDocument();
$doc->loadXML($xmlstr);
$authnRequest = $doc->saveXML();

error_log("authenticationRequest = " . $authnRequest);

return array(true, $idp_sso_url . '?SAMLRequest=' . base64_encode(gzdeflate($authnRequest)));

错误日志输出的原始XML(压缩Base64编码前)

<?xml version="1.0"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
                        xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"   
                        ID="_295db7afe835f11035055d8f8b3b34eff04d9ff4" 
                        Version="2.0" 
                        ProviderName="mysamlsp" 
                        IssueInstant="2025-06-19T16:20:21Z"
                        Destination="https://accounts.google.com/o/saml2/idp?idpid=C******sy" 
                        ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
                        AssertionConsumerServiceURL="https://mysamlsp.com.au/ui/samlacs.php">
    <saml:Issuer>https://mysamlsp.com.au/ui/login.php?id=71142</saml:Issuer>
    <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" AllowCreate="true"/>
    <samlp:RequestedAuthnContext Comparison="exact">
        <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
    </samlp:RequestedAuthnContext>
</samlp:AuthnRequest>

收到的Google Workspace错误响应

错误响应截图


问题排查与解决方案

1. EntityID不匹配

Google Workspace要求SP的EntityID必须是固定值,且与<saml:Issuer>内容完全一致。你当前的Issuer是带动态参数id=71142的URL,这大概率和Google后台配置的EntityID不符。建议改成固定URL(比如https://mysamlsp.com.au/saml/entity-id),同步更新Google Workspace里的配置。

2. 压缩与编码不符合SAML标准

你使用gzdeflate压缩,但Google Workspace只兼容gzip格式的压缩,且Base64编码后需要做URL安全转换:

// 替换原编码逻辑
$encodedRequest = base64_encode(gzencode($authnRequest));
// 转换为URL安全的Base64格式
$urlSafeRequest = str_replace(array('+', '/', '='), array('-', '_', ''), $encodedRequest);
return array(true, $idp_sso_url . '?SAMLRequest=' . $urlSafeRequest);

3. RequestedAuthnContext的Comparison值不兼容

Google Workspace对exact匹配的要求极严,建议将Comparison值改为minimum,或者直接删除整个<samlp:RequestedAuthnContext>节点:

<samlp:RequestedAuthnContext Comparison="minimum">
    <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
</samlp:RequestedAuthnContext>

4. ProtocolBinding与ACS绑定需一致

你设置的ProtocolBinding是HTTP-POST,要确保Google Workspace里配置的ACS绑定也是POST类型;若使用Redirect绑定,需将ProtocolBinding改为urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect。


内容的提问来源于stack exchange,提问作者muz the axe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:44:52