自定义PHP SAML认证请求无法通过Google Workspace IDP验证求助
我试过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

