Zend Framework + Facebook Connect的架构

时间:2010-11-11 07:01:09

标签: zend-framework facebook

我目前正在使用ZF构建一个应用程序并希望集成Facebook Connect - 对架构有一些疑问。

功能 所有登录都通过FB连接,没有其他登录表单。当用户首次单击“连接”时,应用程序需要在数据库中为它们创建条目,以将额外数据绑定到(评论,配置文件等)。

如果用户未登录,则标题应在所有页面上都有“使用FB Connect登录”按钮,如果是,则应该有欢迎消息/图片/配置文件完成%栏。

建筑 据我所知,有两个组件 - 一个处理登录,重定向和cookie编写的JS调用(fb:login-button)和一些读取cookie的PHP。我对应该去哪里感到有点困惑。

登录按钮是通过JS,所以我在layout.phtml中加载它并通过View Helper处理cookie检查 - 帮助程序检索cookie并将其返回到视图。这很好,但我需要处理诸如检查用户是否存在以及向数据库添加新用户之类的事情 - 这似乎不属于帮助者。

我重构了它,将PHP包含在用户控制器中,但是我需要视图中的cookie,它由不同的控制器呈现。我调用了一个视图动作助手,但这似乎更多的是返回部分页面,我无法从中获取cookie数组变量。

我对MVC很新,看起来我错过了一些相当明显的东西 - 想法?

代码就在FB开发者网站上:

class Zend_View_Helper_FacebookCookie extends Zend_View_Helper_Abstract
    {
        public function facebookCookie()
        {
            $FACEBOOK_APP_ID = 'xxx';
            $FACEBOOK_SECRET = 'xxx';
            $cookie = $this->getFacebookCookie($FACEBOOK_APP_ID, $FACEBOOK_SECRET);
            //Zend_Debug::dump($cookie);
            return $cookie;
        }




        public function getFacebookCookie($app_id, $application_secret)
        {
            $args = array();
            parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
            ksort($args);
            $payload = '';
            foreach ($args as $key => $value) {
              if ($key != 'sig') {
                $payload .= $key . '=' . $value;
              }
            }
            if (md5($payload . $application_secret) != $args['sig']) {
              return null;
            }
            return $args;
        }
    }

并在视图中:

if ($cookie) { ?>
   Your user ID is <?= $cookie['uid'] ?>
<?php } else { ?>
    <fb:login-button></fb:login-button>
<?php } ?>

1 个答案:

答案 0 :(得分:0)

我过去实现这个的方式是通过一个preDispatch插件 - 它用Facebook API检查用户的状态,然后修改他们的本地状态(即登录/未登录)并存储使用Zend_Auth和/或Zend_Session进行状态。

如果用户通过Facebook验证但尚未在您的数据库中验证,则preDispatch插件会在设置其本地状态之前在您的数据库中创建记录。

然后,您可以稍后在应用程序中查询Zend_Auth以确定用户是否已登录。

这里的好处是,如果您实现其他身份验证机制(OpenID或其他),您可以简单地创建另一个插件来执行此操作,而您不必修改用户的其余部分,最终由Zend_Auth进行“本地”身份验证)。