0

我正在使用 ATK4 的 OAuth Facebook 控制器插件。

  • 从常规桌面浏览器向 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}&scope=email&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 创建一个新应用程序,但我遇到了与基本普通配置相同的问题。我只标记并指定了“带有 Facebook 登录的网站”站点 URL 集成。

下图是在将用户代理覆盖到移动设备以触发转发到 facebook 的移动服务器后从 Chrome 捕获的: 请求的屏幕截图

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

4

4 回答 4

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"));
        }
    }
}
于 2013-05-09T19:52:56.240 回答
1

我遇到了同样的问题,但使用 PHP:仅使用移动 Web 浏览器不起作用,出现“500 内部服务器错误”。

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

于 2013-05-20T18:46:08.740 回答
0

我在这里报告了这个问题:https ://github.com/atk4/atk4-addons/issues/35

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

于 2013-05-09T09:23:16.193 回答
0

导致错误的 FB 移动 OAuth 服务发生了变化。我在较短的 URL(即http://domain.net/fb/而不是http://development.project.domain.net/fb)上使用我的代码库进行了测试,它工作正常。我不完全确定到底是什么导致了这个问题,因为 Facebook 拒绝承认这个问题在他们的服务器上,但我有一些可能的罪魁祸首可能会触发他们这边的错误,但因为他们不在乎,我也没有,我正在为遇到这个 bs 的其他人提供我的结果。

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

我不再对此进行测试,因为这确实是 Facebook 的问题,而不是我的代码或服务器的问题,而且它可以在生产环境中工作。

于 2013-06-11T22:16:34.060 回答