Facebook的移动网站上的AgileToolkit OAuth附加错误500

时间:2013-05-08 22:44:01

标签: facebook oauth

我正在为ATK4使用OAuth Facebook控制器附加组件。

  • 从常规桌面浏览器使用Facebook进行身份验证时,它可以正常工作。
  • 使用移动浏览器进行身份验证时可以正常运行,该浏览器告诉脸书本它是桌面浏览器。
  • 当Facebook检测到移动浏览器并重定向到m.facebook.com/dialog/oath时,它无效。

更重要的是,它适用于移动浏览器的注册(即,当Facebook要求用户授予应用程序权限时)。

登录流程停止,错误500位于: https://m.facebook.com/dialog/oauth?redirect_uri= {my_url_encoded_landing_page_where_the_OAuth_controller_lives}&安培;范围=电子邮件&安培; CLIENT_ID = {fb_app_id}

这到底是怎么回事? Facebook移动服务和插件没有关注的普通移动服务之间没有区别,或者有没有?

一定是我做错了。在处理FB的页面上的init()中,我正在执行以下操作:

function init(){
    parent::init();
    $f = $this->add("oauth/Controller_OAuth_Facebook", array('sign_method'=>'PLAINTEXT'));

    if ($fbtoken = $f->check()) {
        $f->setSignatureInfo(); 
        $f->setAuthToken($fbtoken["access_token"], $fbtoken["expires"]); 

        $s = $this->add("sni/Controller_SNI_Facebook"); 
        $s->setOAuth($f);
        // ... 
        // grab profile from SNI, database lookup, session stuff, etc
        // ...
    }
}

我已经尝试了所有三种sign_methods,并尝试不管它,但这并没有太大的区别,因为用户没有使用访问令牌将其恢复到控制器,无论如何。

我尝试用Facebook创建一个新的应用程序,我在基本的vanilla配置上遇到了同样的问题。我只标记并指定了“网站与Facebook登录”网站URL集成。

在将用户代理覆盖到移动设备以触发转发到Facebook的移动服务器之后,从Chrome中捕获了以下图片: Screen shot of request

Facebook关闭了我的错误报告,声称这不是问题,因为没有其他人报告错误。我正在移除ATK4标签,因为我在GIT上使用Facebook提供的示例PHP代码得到同样的问题。

4 个答案:

答案 0 :(得分:1)

此处创建了专门的示例: http://demo.ambienttech.lv/d.html?ns=d3

示例可下载,并包含设置Facebook应用程序的说明。看看是否有帮助。


试试这个:

<?php
class page_fb extends Page {
    function init(){
        parent::init();    
        $f = $this->add("oauth/Controller_OAuth_Facebook");
        $fbtoken = $this->api->recall("fbtoken");
        if ($m = $_GET["error_msg"]){
            $v=$this->add("View_Error");
            $v->add("Text")->setHTML("You can't connect to the application.");
            $v->add("Button")->setHTML("Try again")->js("click", $this->js()->univ()->location("fb"));
            return;
        }
        if (!$fbtoken){
            if ($fbtoken = $f->check("email")){
                $this->api->memorize("fbtoken", $fbtoken);
                $this->api->redirect($this->api->url("/index"));
            }
        } else { 
            $f->setSignatureInfo();
            $f->setAuthToken($fbtoken["access_token"], $fbtoken["expires"]);

            $c = $this->add("sni/Controller_SNI_Facebook");
            $c->setOAuth($f);

            if (!$this->api->recall("fbuserinfo")){
                $this->api->memorize("fbuserinfo", $c->getUserProfile());
            }
            $info = $this->api->recall("fbuserinfo");
            $username = $info->username;
            $img = $c->customRequest("/" . $username . "/picture?type=large");
            $this->api->memorize("userimg", $img);
            $this->api->memorize("userinfo", $info);            

            if (!$this->api->auth->isLoggedIn()){
                $this->api->auth->login($info->email);
            }
            $this->api->redirect($this->api->url("/index"));
        }
    }
}

答案 1 :(得分:1)

我遇到了同样的问题,但是使用PHP:只是使用移动网络浏览器无效,导致'500内部服务器错误'。

我只是问自己是否存在方法getLoginUrl的参数,以强制返回非移动版本的身份验证页面...

答案 2 :(得分:0)

我在此处报告此问题:https://github.com/atk4/atk4-addons/issues/35

请继续关注,如果可以,您可以随时自行更改并提出请求。 我无法测试和解决这个问题因为奇怪的是我还没有智能手机:(

答案 3 :(得分:0)

FB的移动OAuth服务中发生了一些导致错误的内容。我使用较短的网址(即http://domain.net/fb/而不是http://development.project.domain.net/fb)运行了我的代码测试,它运行正常。我不完全确定究竟是什么导致了这个问题,因为Facebook拒绝承认这个问题是在他们的服务器上,但我有一些可能的罪魁祸首可能引发他们的错误,但由于他们不关心,我也没有,我正在为遇到这个bs的其他人提供我的结果。

  • 我正在开发的环境使用半复杂(显然)命名方案。开发服务器在子域下有自己的主机名。 问题可能是由于URL的主机部分有多个组件或者字符太多这一事实造成的。
  • 开发环境的名称服务器由DynDNS提供。 Facebook的移动OAuth服务可能会因为开发网站托管在非永久性IP地址上而感到窒息。

我不会再对此进行测试,因为它确实是Facebook的问题,而不是我的代码或服务器,它将在生产中发挥作用。