ivan-novakov / php-saml-ecp-client
PHP中的SAML ECP客户端实现
Requires
- php: >=5.3.3
- zendframework/zend-http: >=2.2.0
- zendframework/zend-log: >=2.2.0
- zendframework/zend-stdlib: >=2.2.0
Requires (Dev)
- zendframework/zend-config: >=2.2.0
This package is not auto-updated.
Last update: 2024-09-23 13:33:46 UTC
README
介绍
如当前规范草案中所述,SAML V2.0增强客户端或代理(ECP)配置文件是用于HTTP的SSO配置文件,客户端可以直接联系主体身份提供者(身份提供者),而无需服务提供商进行发现和重定向,如浏览器的情况。这对于桌面或服务器端HTTP客户端特别有用。
该库试图遵循ECP配置文件规范。目前,它不支持“密钥持有者”和“通道绑定”功能。该库的状态是“高度实验性”。它尚未完全准备好,并且尚未在不同的环境中进行测试。
要求
- PHP >= 5.3
- Zend Framework >= 2.*
- Shibboleth SP/IdP
安装
如果您在项目中使用composer,您只需将以下要求添加到您的composer.json
文件中
"ivan-novakov/php-saml-ecp-client": "dev-master"
否则,克隆仓库并配置自动加载器以在仓库的lib/
目录中查找Saml命名空间。
基本用法
use Saml\Ecp\Flow;
use Saml\Ecp\Client\Client;
use Saml\Ecp\Discovery\Method\StaticIdp;
use Saml\Ecp\Authentication\Method\BasicAuth;
$flow = new Flow\Basic();
$client = new Client(array(
'http_client' => array(
'options' => array(
'cafile' => '/etc/ssl/certs/tcs-ca-bundle.pem'
)
)
));
$flow->setClient($client);
$authenticationMethod = new BasicAuth(array(
'username' => 'user',
'password' => 'passwd'
));
$discoveryMethod = new StaticIdp(array(
'idp_ecp_endpoint' => 'https://idp.example.org/idp/profile/SAML2/SOAP/ECP'
));
$response = $flow->authenticate('https://sp.example.com/secure', $discoveryMethod, $authenticationMethod);
客户端对象负责实际工作 - 发送请求并验证响应。Flow对象使用客户端对象以适当的顺序发出请求。authenticate()方法执行整个ECP流程,当客户端尝试访问受保护的资源并被重定向到IdP进行身份验证时。除了资源URL之外,authenticate()方法还需要一个发现方法对象,它确定用于身份验证的IdP,以及一个身份验证方法对象,它调整身份验证请求。
在这种情况下,发现方法(StaticIdP)仅返回IdP端点。身份验证方法(BasicAuth)根据提供的凭据调整请求以执行基于HTTP基本身份验证的请求。
Shibboleth SP配置
Shibboleth SP支持ECP配置文件,但在SessionInitiator配置中需要“打开”。
<SessionInitiator id="ECP" type="SAML2" Location="/ECP" ECP="true"
entityID="https://idp.example.org/idp/shibboleth">
</SessionInitiator>
如果这不是默认会话启动器(如上面的示例),您需要配置Apache使用正确的会话启动器来保护受保护资源
<Location /secure>
AuthType shibboleth
ShibRequestSetting requireSessionWith ECP
Require valid-user
</Location>
Shibboleth IdP配置
IdP支持ECP配置文件“开箱即用”。目前,ECP配置文件处理程序需要基于外部Web服务器的身份验证。基本上,这意味着您需要像使用RemoteUser登录处理程序一样,用某种HTTP基本身份验证保护ECP配置文件处理程序端点。
<Location /idp/profile/SAML2/SOAP/ECP>
AuthType Basic
AuthName "IdP ECP endpoint authentication"
AuthBasicProvider ldap
AuthLDAPURL "ldap://127.0.0.1/o=example.org"
AuthzLDAPAuthoritative off
require valid-user
</Location>
高级用法
这个库更像是框架而不是现成应用程序。有许多环境和用例,并且无法“开箱即用”地覆盖所有这些。这就是为什么这个库被设计得尽可能灵活和可扩展。某些部分可以轻松地用替代实现交换或用附加功能扩展。
HTTP客户端
《Saml\Ecp\Client\Client》对象在内部使用带有cURL适配器(Zend\Http\Client\Adapter\Curl)的《Zend\Http\Client》对象。出于安全原因,默认启用对等方和主机验证(CURLOPT_SSL_VERIFYPEER = true
,CURLOPT_SSL_VERIFYHOST = 2
)。您必须传递以下选项之一
- cafile - 包含用于对等方/主机验证的CA证书的文件的路径
- capath - 包含用于对等方/主机验证的CA证书的目录的路径
您也可以通过这些选项直接将选项传递给HTTP客户端和cURL适配器
示例
$client = new \Saml\Ecp\Client\Client(array(
'http_client' => array(
'options' => array(
'cafile' => '/etc/ssl/certs/ca-bundle.crt'
),
'zend_client_options' => array(
'useragent' => 'My ECP Client v0.1'
),
'curl_adapter_options' => array(
CURLOPT_FORBID_REUSE => true
)
)
));
客户端对象使用《Saml\Ecp\Client\HttpClientFactory》根据“http_client”选项创建HTTP客户端对象。您不需要将“http_client”选项传递给客户端对象,而是可以显式创建《Zend\Http\Client》对象并注入它
$httpClient = new \Zend\Http\Client();
$httpClient->setOptions(array(
// options
));
$adapter = new \Zend\Http\Client\Adapter\Curl();
$adapter->setOptions(array(
// options
));
$httpClient->setAdapter($adapter);
$client = new \Saml\Ecp\Client\Client();
$client->setHttpClient($httpClient);
发现方法
您可以通过实现《Saml\Ecp\Discovery\Method\MethodInterface》来编写自己的IdP发现方法。
认证方法
您可以通过实现《Saml\Ecp\Authentication\Method\MethodInterface》来编码另一个认证方法。
请求
如果您需要实现替代请求对象,您可以扩展《Saml\Ecp\Request\AbstractRequest》对象,或仅实现《Saml\Ecp\Request\RequestInterface》。您还必须通过实现《Saml\Ecp\Request\RequestFactoryInterface》来创建自己的请求工厂,并将其注入到《Saml\Ecp\Client\Client》对象中,以便客户端可以使用您的替代请求对象而不是“标准”对象。
响应
与请求类似,您可以通过扩展抽象响应类(《Saml\Ecp\Response\AbstractResponse》)或通过实现响应接口(《Saml\Ecp\Response\ResponseInterface》)来编写自己的响应。此外,您还需要编写替代响应工厂,实现《Saml\Ecp\Response\ResponseFactoryInterface》。
响应验证
响应验证是通过《Saml\Ecp\Response\Validator\ValidatorFactory》创建的验证器来实现的。验证器必须实现《Saml\Ecp\Response\Validator\ValidatorInterface》,验证器工厂必须实现《Saml\Ecp\Response\Validator\ValidatorFactoryInterface》。验证器工厂必须注入到客户端对象(《Saml\Ecp\Client\Client》)中。
许可证
链接
规范
- https://wiki.oasis-open.org/security/SAML2EnhancedClientProfile
- http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
- http://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf
- http://www.projectliberty.org/liberty/content/download/1219/7957/file/liberty-paos-v1.1.pdf
- http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-channel-binding-ext.pdf