1

私はHybridAuthを構成しようとしていますが、非常に初期の段階です。今私がやりたいのは、接続して、HAがFacebookにリダイレクトし、アプリのインストールを求めるプロンプトを表示することを確認し、ユーザーが戻ってきたときにユーザーを認証することだけです。

私は手動で以下を呼び出しています:http: //mydomain.com/auth.php?provider = Facebook

auth.phpは次のようになります。

session_start();
require_once($_SERVER['DOCUMENT_ROOT'] . "/func/db_connect.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/api/auth/Hybrid/Auth.php");      // HybridAuth Module 

$hybridauth_config = include($_SERVER['DOCUMENT_ROOT'] . '/api/auth/config.php');

if ($_GET['provider'] == '' || !in_array($_GET['provider'], array_keys($hybridauth_config['providers']))) {
    echo 'Invalid Provider';
} else {
    try { 
        $hybridauth = new Hybrid_Auth($hybridauth_config);

        // try to authenticate with this provider
        $adapter = $hybridauth->authenticate($_GET['provider']);

        // grab user profile
        if ($hybridauth->isConnectedWith($f_provider)) {
            // yep, we're connected.  Add this provider's info to the user_auth table
            echo 'connection successful';
        }

    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

Facebookに転送し、適切な権限で正しいアプリをインストールするように求めるという点で機能します。これは、HA構成が正常に機能していることを示しています。アプリを正常にインストールすると、ページにリダイレクトされ、次のメッセージが表示されます。

Authentification failed! Facebook returned an invalide user id.

何が得られますか?私のアプリでは、FBコントロールパネルにも0個の追加と0個のAPI呼び出しが表示されます(ただし、このデータは数日遅れる可能性があります)。FBが何らかの方法でアプリを有効にするのを待っていますか?私は何か間違ったことをしていますか?

アップデート

HybridAuthはFacebookSDKを使用しているので、方程式全体からHAを排除しようとしました。次の基本的な例を実行します。

session_start();

require($_SERVER['DOCUMENT_ROOT'] . "/path/to/fbsdk/facebook.php");
$facebook = new Facebook(array(
  'appId'  => 'myappid',
  'secret' => 'myappsecret',
  'fileUpload' => true
));

$user = $facebook->getUser();
var_dump($user);

Facebookにログインし、アプリケーションを追加しましたが、何をしてもユーザーIDは0を返します。テストユーザーも使用してみましたが、役に立ちませんでした。ここで見逃している可能性のあるサーバー構成の問題はありますか?

4

4 に答える 4

5

コードを別のアプリ/サーバーに移動してから、別のサーバーの同じアプリに移動しましたが、すべて正常に機能しました。そこで、サーバー構成の問題として調査を開始しました。Facebookは私の開発サーバーの自己署名証明書を気に入らなかったことがわかりました。

PHP SDKのbase_facebook.phpクラスを変更し、SSL検証ステップを無視するようにcurloptを追加することで、この問題を解決することができました。下記参照:

  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.1',
    CURLOPT_SSL_VERIFYPEER => false
  );
于 2012-04-26T20:31:08.733 に答える
0

私は、hybridauthとfacebooksdkの現在のバージョンでもこのエラーが表示される理由を理解することができました。

その理由は、hybridauthとgoogleまたはfacebooksdkがredirect_uriパラメーターを構築する方法にあります。https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/からわかるように、最初にユーザーをfacebookにリダイレクトする必要があります(redirect_uri paramを使用)。デフォルト。再度curlを使用して(redirect_uri paramを使用して)httpリクエストを送信しましたが、前述の理由により、これらのURLは一致しません。

言い換えれば、hybridauth config (スラッシュなし)で設定した場合-> googleでは正常に機能しますが、Facebookログインではこのばかげたメッセージエラーが発生します。"base_url" => "http://yourhost/hybridauth/hybridauth"

"base_url" => "http://yourhost/hybridauth/hybridauth/"、(スラッシュ付き)はFacebookで問題なく動作しますが、Googleでエラーが発生し、「Uriの不一致をリダイレクト」という明確なエラーが発生します。

したがって、クイックフィックスでは、構成に「(スラッシュなし)」が最適ではありません。"base_url" => "http://yourhost/hybridauth/hybridauth

そして、URIの構築方法を選択するのはプロバイダーによって異なります。

Provider_Adapter.phpコメント行131 // $this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";

代わりにこれら2つを追加します。

$dlm = $this->id == "Facebook" ? "/?" : "?";

$this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, $dlm ) ? '&' : $dlm ) . "hauth.done={$this->id}";

このようにして、FacebookとGoogleの両方をサポートするソリューションがあります。

于 2013-11-15T12:01:07.417 に答える
0

これに遭遇し、上記の答えが機能しない他の人にとって、私は同じ問題に直面していましたが、Facebook上の私のアプリはまだサンドボックスモードでした。アプリの設定でこれをオフにすると、ユーザーIDが0になる問題が解決されます。

于 2013-11-28T02:07:25.670 に答える
0

ハイブリッド認証は、スコープパラメータに一連の「0」を追加します。ハイブリッド認証コアクラスを変更するというこのアイデアがどれほど優れているかはわかりませんが、Hybrid / Providers / Facebook.phpのloginBegin関数を変更しただけで、正常に機能しています。

function loginBegin()
{
  $parameters = array("scope" => $this->scope, "redirect_uri" => $this->endpoint, "display" => "page");
  $optionals  = array("scope", "redirect_uri", "display");

  foreach ($optionals as $parameter){
    if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
      $parameters[$parameter] = $this->config[$parameter];
    }
  }

  if (isset($parameters['scope'])) {
    foreach ($parameters['scope'] as $key => $parameter){
      if ($parameter == '0') {
        $parameters['scope'][$key] = '';
      }
    }
  }

  // get the login url 
  $url = $this->api->getLoginUrl( $parameters );

  // redirect to facebook
  Hybrid_Auth::redirect( $url );
}
于 2014-03-07T06:43:19.993 に答える