如何通过 iframe 调用验证第三方网站

Gub*_*ooo 3 php authentication iframe zend-framework http-authentication

我正在与一所大学合作,需要整合我的课程 - 以便他们的学生可以在大学网站上访问它。我们将进行简单的 iframe 集成。

用户将在大学网站上注册,他们会将用户信息传递给我,以便我可以开始一个会话并允许访问我网站上的课程页面,这些页面将通过 iframe 显示在他们的网站上。

我的网站是基于 LAMP 构建的,我使用 ZEND 框架

这是我打算如何做的骨架结构

1)在大学网站上,作为 iframe 代码的一部分 - 他们将调用我的一个操作类并传递用户电子邮件

<iframe src="http://mywebsite/user/validate/email/alice@gcc.com"></iframe>
Run Code Online (Sandbox Code Playgroud)

2)现在在用户控制器中 - 验证操作 - 我基本上将检查用户是否不存在 - 创建一个新用户或使用他的电子邮件加载现有用户并启动 Zend Auth 实例并将用户写入存储并重定向到他的课程页面如下所示

$currentUser = $userModel->loadUserProfileByEmail($this->_getParam('email'));
$auth = Zend_Auth::getInstance();
$storage = $auth->getStorage();         
$storage->write($currentUser);
return $this->_redirect('/user/my-courses/');
Run Code Online (Sandbox Code Playgroud)

这就是我到目前为止所拥有的 - 显然它有效

我的问题

1)这是最好的方法吗?我不会拥有用户的密码,因为身份验证发生在大学网站上,他们不希望用户直接登录我的网站。

2)这是一个大问题。我对验证该电话是由这所特定大学拨打的最佳方式感到有点困惑。我该如何解决这个问题 - 他们是否随此 iframe 调用一起传递加密令牌 - 并且只有我有解密它的密钥 - 我没有这样做 - 我不知道我是否将简单的事情复杂化了。

任何意见或建议将不胜感激谢谢

bis*_*hop 5

我的建议摘要

  • 查看他们是否有联合身份和单点登录 (FSSO)解决方案。如果他们这样做,请使用他们拥有的东西。
  • 如果没有,建议他们获得FSSO(我推荐Shibboleth),并使用它。
  • 如果他们不这样做,您可以通过对 Facebook 到 Facebook 应用程序交换进行建模来推出您自己的应用程序。

详细信息
在 FSSO 中,有一个“身份提供商”(IdP) 和一个“服务提供商”(SP)。学院是身份提供者,您是服务提供者。可以有很多服务提供商。只需记住 IdP=大学,SP=您。FSSO 的要点:

  1. 用户通过 IdP 而不是 SP 进行身份验证。
  2. 当 IdP 发出会话已通过身份验证的信号时,SP 就会信任它。
  3. 仅当用户在 IdP 处进行身份验证时,SP 才会收到经过身份验证的会话信号。

根据教育事业,大多数大学都有 FSSO。因此,我的第一个建议是进行实况调查,以了解学院使用的内容。如果他们已经有了 FSSO,您的内容会更安全,您的代码会更简单,而且您晚上会睡得更好。幸运的是,我的经验是,大学经常有一些东西,但这些东西的知识不一定是传播的——你必须挖掘一下。

如果他们没有 FSSO,我的下一个建议是建议他们安装一个。了解这些选项,记住单点登录并不意味着联合 ID,而您两者都需要。

就我个人而言,我推荐Shibboleth。它是开源的。我已经将它与 LAMP 和 ZF1 一起使用。我知道它有效。使用 Shibboleth,学院将设置一个 Shibboleth IdP,您将设置您的 SP,一起参与身份数据流,一旦用户登录,您将在每个连接信令身份验证上收到环境变量,如下所示:

array (
    // ...
    [Shib-Application-ID] => my_course_catalog
    [Shib-Session-ID] => _6c45a07c8bc73190242212124221b7
    [Shib-Identity-Provider] => https://shib.college.edu/idp/shibboleth
    [Shib-Authentication-Instant] => 2013-12-31T22:42:07.101Z
    [Shib-AuthnContext-Decl] => urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
    [affiliation] => member@college.edu;staff@college.edu
    [eppn] => XXXXXX@college.edu
    [unscoped-affiliation] => member;staff
    // ...
    [REMOTE_USER] => XXXXXX@college.edu
    // ...
)
Run Code Online (Sandbox Code Playgroud)

我在 ZF1 中实现这一点的方法是使用一个控制器插件来查找Shib-Session-ID. 如果找到,则制造 Shibboleth 资源并填充Shib-Session-ID和REMOTE_USER,我稍后可以查询我需要的一切。如果未找到,请重定向至 IdP 登录页面。(由于您位于 IFRAME 中,因此请勿执行此操作:而是重定向到“无内容可显示”/“默认内容”操作。)

如果他们不接受安装 FSSO 的提议怎么办?然后你必须自己推出,正如你所指出的,你的症结将是信任。

他们向您发送令牌(您的第二个问题)的问题是令牌可以被拦截(以不同程度的容易程度)并针对您重放。你不能相信你所得到的东西。你必须接受你所得到的信息,并询问你信任的消息来源来验证所提供的信息。

更大的问题是,您需要知道现在浏览网页的用户是否是曾经和现在登录的同一用户。为此,您需要大学颁发的登录 cookie,并且您需要检查 cookie 是否已登录。目前有效。

没有简单的方法可以安全地做到这一点。这就是发明 FSSO 的原因,因此所有繁重的工作都可以以可证明安全的方式一次性完成。如果您仍然拥有自己的应用程序,我可以提供的最佳模型是 Facebook 应用程序。在第三方服务器上运行的“应用程序”可以“看到”登录的 Facebook 用户。为了帮助您入门,请参阅有关应用程序身份验证的 Facebook 教程。

(当前完成应用程序身份验证的方式是带有登录会话 ID 的IFRAME POST,您可以通过 Facebook 检查该 ID...但我知道浏览器不再允许这样做,您必须绕过它。我不知道当然,要记住一些事情。)

从长远来看,FSSO 对学院来说是一笔资产,对你来说也是一个福音。如果可能的话就这么做吧。否则,具有身份验证功能的 IFRAME 第三方应用程序的最先进技术是 Facebook 到 Facebook 应用程序交换,因此请对其进行建模。祝你好运!