我正在使用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',
);
答案 0 :(得分:1)
您的问题是您的身份提供商配置为使用sql auth而不是twitter,linkedin等.dudupal站点会将您发送到IDP,而IDP只能了解sql。虽然您确实为社交配置了authsources,但SSP允许您独立于IDP配置进行测试和验证。这就是为什么SSP只是在模板中显示社交属性,而不是让你用它们登录drupal。
multiauth可让您定义包含社交和SQL的authsource
。然后,配置idp以使用新的multiauth authsource
每个社交提供商的IDP。我们为每个社交提供商运行IDP。我们在saml20-idp-hosted.php
中定义了多个IDP(具有唯一的实体ID) - 每个社交帐户一个。我们这样做是因为我们的每个SP只想信任所有已配置的社会IDP的子集。
此选项中的每个SP都会在saml20-idp-remote.php
外包。我们将这种社交方式作为SaaS product运行到saml网关。如果您不喜欢自己运行,或者您有多个SP需要不同的社交提供商,或者每个SP使用不同的社交api密钥/秘密,这是有道理的。