Facebook API:获取电子邮件的用户权限并避免CANCEL循环

时间:2011-07-27 06:48:39

标签: facebook zend-framework

我正在开发一个facebook应用程序。我正在提供一个网页,它将成为facebook粉丝页面中的iFrame。问题是,当用户点击cabncel(不允许)按钮(它循环)时,我无法处理这种情况。

有人能给我一个简单的例子来说明如何处理权限请求吗?假设我只需要访问用户电子邮件,并且当用户点击取消时我想重定向到页面墙,因此不会循环播放。

这是控制器的一些代码

$this->facebook = Zend_Registry::get('facebook');
$signed_request = $this->facebook->getSignedRequest();
$this->view->hasAllowed = isset($signed_request['oauth_token']) ? true : false;

这是从视图:

<?php if(!$this->hasAllowed): ?>
<script type="text/javascript">
   top.location.href = '<?= $this->oauth_url ?>';
</script>
<?php endif;?>
<div id="fb-root"></div>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript">
    FB.init({
      appId  : '<?=$this->app_id?>',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : true  // parse XFBML
    });
</script>

2 个答案:

答案 0 :(得分:2)

来自the docs

  

如果用户按下“不允许”,则表示您的应用未获得授权。 OAuth对话框将(通过HTTP 302)用户的浏览器重定向到您在redirect_uri参数中传递的URL,并显示以下错误信息:http://YOUR_URL?error_reason=user_denied& error = access_denied&amp; error_description = +用户+拒绝+您的+请求。< / p>

因此,您当前的问题是,如果用户单击“不允许”,您将显示包含相同JS登录代码的相同视图,然后重新启动该过程。您需要做的就是检查error_reason参数的回调操作,如果存在并设置为user_denied,请改为重定向到应用墙页:

public function callbackAction()
{
    if ($this->_hasParam('error_reason') && $this->_getParam('error_reason') == 'user_denied') {
        $this->_helper->Redirector->setGotoUrl('http://example.com/yourapppage');
    }
}

或者,您可以呈现一个不同的视图,向用户解释您的应用为何需要其权限,并为他们提供再次登录的选项。

答案 1 :(得分:0)

我看不出你的$this->oauth_url是什么,但它必须是这样的:

top.location.href="http://www.facebook.com/connect/uiserver.php?app_id=APP_ID&method=permissions.request&display=page&next=URL_TO_GO_WHEN_USER_ACCEPT&cancel_url=URL_TO_GO_WHEN_USER_CANCEL&response_type=token&canvas=1&perms=email";

您可能需要的是cancel_url参数,如果他不允许,会将用户重定向到此网址。

希望它有所帮助!