ivan-novakov/php-saml-ecp-client

PHP中的SAML ECP客户端实现

0.1.0 2013-09-13 12:29 UTC

This package is not auto-updated.

Last update: 2024-09-23 13:33:46 UTC


README

Dependency Status

介绍

如当前规范草案中所述,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 = trueCURLOPT_SSL_VERIFYHOST = 2)。您必须传递以下选项之一

  • cafile - 包含用于对等方/主机验证的CA证书的文件的路径
  • capath - 包含用于对等方/主机验证的CA证书的目录的路径

您也可以通过这些选项直接将选项传递给HTTP客户端和cURL适配器

  • zend_client_options - 如在ZF2手册中所述的选项数组
  • curl_adapter_options - 如在ZF2手册中所述的选项数组

示例

$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》)中。

许可证

链接

规范