SimpleSAMLphp生成断言

时间:2016-02-15 20:49:54

标签: php oauth-2.0 saml simplesamlphp

我正在使用SimpleSAMLphp作为IdP用于我们拥有的一系列应用程序,主要是 Drupal 网站。我在IdP上使用SQL作为authsource,用于验证用户,响应返回 Drupal ,用户通过身份验证。一切都好!

但是我们还需要使用社交登录(使用Twitter,Facebook等登录)。 SimpleSAMLphp 支持 OAuth ,我已将其设置为登录, IdP 的社交帐户 SimpleSAML 创建会话和cookie但我没有在Drupal站点上进行身份验证。

我需要做的是通过返回Drupal并在那里验证用户来完成请求,即在成功时向Drupal发出断言。

就像在SQL源代码中一样,我已经映射了每个源文件(Twitter.php,Facebook.php等)中的属性,但是当SQL身份验证返回到Drupal并创建会话时,其他人只显示其属性在模板中。

如何从这些社交登录中生成并发回 Drupal 断言,以便在那里验证我的用户?

saml10-sp-remote.php (IdP)

$metadata['https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/metadata.php/sp'] = array (
  'SingleLogoutService' =>
  array (
    0 =>
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/saml2-logout.php/sp',
    ),
    1 =>
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP',
      'Location' => 'https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/saml2-logout.php/sp',
    ),
  ),
  'AssertionConsumerService' =>
  array (
    0 =>
    array (
      'index' => 0,
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
      'Location' => 'https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/saml2-acs.php/sp',
    ),
    1 =>
    array (
      'index' => 1,
      'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
      'Location' => 'https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/saml1-acs.php/sp',
    ),
    2 =>
    array (
      'index' => 2,
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact',
      'Location' => 'https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/saml2-acs.php/sp',
    ),
    3 =>
    array (
      'index' => 3,
      'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01',
      'Location' => 'https://durpal_url/simplesaml_drupal_sp/module.php/saml/sp/saml1-acs.php/sp/artifact',
    ),
  ),
  'certData' => 'xxxx',
);

authsources.php (IdP)

'sql' => array(
        'sqlauth:SQL',
        'dsn' => 'mysql:host=localhost;dbname=db',
        'username' => 'user',
        'password' => 'pass',
        'query' => 'SELECT u.uid, u.name, u.mail, r.name AS role FROM users u JOIN users_roles ur on ur.uid = u.uid JOIN role r on r.rid = ur.rid where u.mail = :username AND pass = MD5(:password);',
    ),

'facebook' => array(
    'authfacebook:Facebook',
    'api_key' => 'xxxx',
    'secret' => 'xxxx',
    'req_perms' => 'email',
),

'linkedin' => array(
    'authlinkedin:LinkedIn',
    'key' => 'xxxx',
    'secret' => 'xxxx',
),

'twitter' => array(
    'authtwitter:Twitter',
    'key' => 'xxxx',
    'secret' => 'xxxx',
    'force_login' => true,
),

saml20-idp-remote.php (SP, Drupal)

$metadata['http://idp_url/simplesaml/saml2/idp/metadata.php'] = array (
  'metadata-set' => 'saml20-idp-remote',
  'entityid' => 'http://idp_url/simplesaml/saml2/idp/metadata.php',
  'SingleSignOnService' =>
  array (
    0 =>
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'http://idp_url/simplesaml/saml2/idp/SSOService.php',
    ),
  ),
  'SingleLogoutService' =>
  array (
    0 =>
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'http://idp_url/simplesaml/saml2/idp/SingleLogoutService.php',
    ),
  ),
  'certData' => 'xxx',
  'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
);

saml20-idp-hosted.php (IdP)

$metadata['__DYNAMIC:1__'] = array(
    'host' => '__DEFAULT__',
    'privatekey' => 'mysite.com.key',
    'certificate' => 'mysite.com.crt',
    'auth' => 'sql',
);

1 个答案:

答案 0 :(得分:1)

背景

您的问题是您的身份提供商配置为使用sql auth而不是twitter,linkedin等.dudupal站点会将您发送到IDP,而IDP只能了解sql。虽然您确实为社交配置了authsources,但SSP允许您独立于IDP配置进行测试和验证。这就是为什么SSP只是在模板中显示社交属性,而不是让你用它们登录drupal。

选项A

multiauth可让您定义包含社交和SQL的authsource。然后,配置idp以使用新的multiauth authsource

选项B

每个社交提供商的IDP。我们为每个社交提供商运行IDP。我们在saml20-idp-hosted.php中定义了多个IDP(具有唯一的实体ID) - 每个社交帐户一个。我们这样做是因为我们的每个SP只想信任所有已配置的社会IDP的子集。

此选项中的每个SP都会在saml20-idp-remote.php

中包含其他IDP数据

选项C

外包。我们将这种社交方式作为SaaS product运行到saml网关。如果您不喜欢自己运行,或者您有多个SP需要不同的社交提供商,或者每个SP使用不同的社交api密钥/秘密,这是有道理的。