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

时间:2013-12-28 15:01:47

标签: php zend-framework authentication iframe http-authentication

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

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

我的网站建立在LAMP上,我正在使用ZEND框架

这是我计划如何做的骨架结构

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

<iframe src="http://mywebsite/user/validate/email/alice@gcc.com"></iframe>

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/');

这是我到目前为止 - 显然它有效

我的问题

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

2)这是一个大问题。我对这个特定的大学正在进行此调用的最佳认证方式感到困惑。我如何解决这个问题 - 他们是否通过加密令牌以及iframe调用 - 只有我有密钥才能解密它 - 我没有这样做 - 我不知道我是否过于简单化了。

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

2 个答案:

答案 0 :(得分:4)

我的推荐摘要

  • 看看他们是否有Federated Identity and Single-Sign On (FSSO)解决方案。如果他们这样做,请使用他们拥有的东西。
  • 如果没有,建议他们a FSSO(我推荐Shibboleth),并使用它。
  • 如果他们不愿意,可以通过建模Facebook到Facebook App交换来推动自己。

<强>详情
在FSSO中,存在“身份提供者”(IP)和“服务提供者”(IP)。学院是身份提供者,您是服务提供者。可以有许多服务提供商。记住IP = College,SP =你。 FSSO的关键点:

  1. 用户使用IP进行身份验证,而不是SP。
  2. 当IP信号通知会话时,SP信任它。
  3. 当用户在IP上进行身份验证时,SP仅接收经过身份验证的会话信号
  4. According to EDUCAUSE,大多数大学都有FSSO。因此,我的第一个建议是进行实况调查,以检查学院的内容。您的内容将更安全,您的代码更简单,如果他们已经拥有FSSO,您将在晚上睡得更好。幸运的是,我的经验是大学经常有东西,但这些东西的知识不一定是广播 - 你必须挖掘一下。

    如果他们没有FSSO,我的下一个建议是建议安装一个。在the options上教育自己,记住单点登录并不意味着联合ID - 你想要两者。

    就个人而言,我建议Shibboleth。这是open source。我用过LAMP和ZF1。我知道它有效。有了Shibboleth,学院会设置一个Shibboleth IP,你会setup your SP,你会一起参加data flow of identity,一旦用户登录,你就会在每个连接上接收环境变量信令认证,如这样:

    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
        // ...
    )
    

    我在ZF1中实现它的方式是一个用于查找Shib-Session-ID的控制器插件。如果找到,请制作一个Shibboleth资源并使用Shib-Session-IDREMOTE_USER填充,我稍后可以查询我需要的所有内容。如果未找到,请重定向到IP登录页面。 (由于您使用的是IFRAME,don't do this:而是重定向到“无内容显示”/“默认内容”操作。)

    如果他们不接受安装FSSO的提议怎么办?然后你必须自己滚动,正如你所指出的那样,你的坚持点就是信任。

    他们向你发送令牌(你的#2问题)的问题是,令牌可以被截获(具有不同程度的轻松)和replayed against you。你不能相信你所得到的。您必须接受所提供的内容并询问您信任的来验证所提供的内容。

    更大的问题是,你需要知道浏览网页现在的用户是 同一用户 仍然已登录。为此您需要大学发布的登录cookie,并且您需要检查该cookie当前是否有效。

    没有简单的方法可以安全地完成它。这就是为什么FSSO被发明的原因,所以所有繁重的工作都可以以可证明的安全方式完成。如果你仍然自己推出,我可以提供的最好的模型是Facebook应用程序。在第三方服务器上运行的“app”“看到”登录的Facebook用户的类型。为了帮助您入门,请点击the Facebook tutorial on app authentication

    (目前应用身份验证的方式是IFRAME POST,其中包含登录会话ID,您可以通过Facebook查看...但我知道浏览器不再允许这样做,您必须得到我不确定,有些事要记住。)

    从长远来看,FSSO是学院的资产,也是您的福音。如果可能的话,那就去吧。否则,具有身份验证的IFRAME第三方应用程序的最新技术是Facebook到Facebook应用程序交换,所以模型。祝你好运!

答案 1 :(得分:2)

我可能误解了你的问题,但从我收集的内容中你需要:

- 验证用户的方法

- 能够在首次加载时查看他们希望查看的页面及其电子邮件地址。

这个基础只是对称密钥身份验证 - 以下所有内容都是将其混搭的方法。

将您的数据放在一起(电子邮件地址,登陆页面),然后使用强密钥对其进行哈希处理。

在另一端解密,瞧 - 完成。

如果您的密码(密钥)难以猜测,此方法是安全的 - 以下是一种难以破解的方法。

<强> AUTHENTICATION

有几种方法可以做到这一点 - 如果您可以访问他们的服务器(或者那些可以为您插入一些代码的人),那么以下方法就可以了。

创建一个执行以下操作的PHP脚本。

我已经大量过度设计了这一点,以证明一种破坏性的硬化方式的破坏 - 你可以选择自己的方式!

(伪代码)

$serverTimeStamp = timestamp;

$additionalNoise = "THEcat1sch33sy";

$time = $serverTimeStamp . "XAB"; <- needs to be a random code as delimeter.
$data =  $additionalNoise + "email@email.com";
$salt = "wh4tW0u1dB4tm4nD0?" + $serverTimeStamp;

$ password然后需要使用可逆散列进行散列(mcrypt是一个很好的起点)

$encrypted = mcrypt of $data and $salt ($salt is shared key);

$authenticationcode = $time . $encrypted;

这会给你一个非常强大的随机字符串,前面有一个时间戳,然后是XAB,然后是一个随机的散列字符串。

然后将其传递给您的用户验证脚本。

<iframe src="http://yoursite/validate/COMPLETELYRANDOMSTRING"></iframe>

从那里你可以改变这个过程。

重要(修订) - 我完全忘记了一个IMPORTANT元素 - 存储在数据库中发送给您的随机字符串。这些字符串是“一次性使用” - 如果你再次收到相同的字符串则是攻击。

这可以通过盐中和字符串开头的时间戳来实现 - 可以使用完全不同的字符串每天发送1000次相同的数据。

Get random string.

get time-stamp from front of random string -> using regex / index of looking for numbers and then XAB (hence the random XAB string - it is just a separator)

$timeStamp = "10200192XAB";

"wh4tW0u1dB4tm4nD0?" <-shared secret key.

$salt (secret key) = "wh4tW0u1dB4tm4nD0?" + $timeStamp;

使用salt解密

您的数据前面有

"THEcat1sch33sy" (your additional noise) (which is also a fixed shared key in effect)

只需删除“THEcat1sch33sy”,然后你就可以获得你的电子邮件地址(然后你可以在百万分之一的机会中验证随机字符串实际上是在发送“THEcat1sch33sy”。

Voila - 不是100%而是相信我 - 如果我想进入你的服务器 - 我不会这样试试!

通过

页面
Simply add it to the $data - so you would pass $email + "seperator" + $coursepage.

希望这有助于(并且很清楚)