3

同様の質問が寄せられていますが、これらの問題の解決策は役に立たないようです。

仮想マシンで実行するローカル開発サイトをセットアップしました: http://lamp.site

index.phpが読み込まれると、次の JavaScript が実行されます (正しい appId を使用):

/* facebook auth */ 
window.fbAsyncInit = function() {
    FB.init({
        appId: '01234567890',
        channelUrl: 'http://lamp.site/channel.html'
    });
};

// Load the SDK Asynchronously
(function(d){
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    ref.parentNode.insertBefore(js, ref);
}(document));

次に、ボタンがクリックされると、次の JavaScript 関数がトリガーされます。

#HTML
<li><a class="btn" href="#" ng-click="connectToFacebook()">Connect with Facebook</a></li>

#Snippet in AngularJS Controller
$scope.connectToFacebook = function() {
    facebookConnect.authenticate(
    function(reason) { // fail
        console.log(reason);
    }, 
    function(user) { // success
        console.log('logged in',user);
        //Session.login();
    });

    return false;
}

#Factory in AngularJS module
.factory('facebookConnect', function() {
return {
    authenticate: function(fail, success) {
        FB.login(function(response) {
            console.log(response);
            if (response.authResponse) {
                FB.api('/me', success);
            } else {
                fail('User cancelled login or did not fully authorize.');
            }
        });
    }
}

Firefox でボタンを押すと、機能します。素敵です。Facebook から正しい情報がすべて返ってきます。

PC で Chrome または Safari を使用している場合、または iPhone で Safari Mobile を使用している場合、Facebook のログイン ウィンドウ ポップアップに「エラーが発生しました。後でもう一度試してください」というメッセージが表示されます。、および次のコンソール データ:

Unsafe JavaScript attempt to access frame with URL
https://www.facebook.com/dialog/permissions.request from frame with URL
http://lamp.site/index.php?page=login. Domains, protocols and ports must match.

Object
authResponse: null
status: "not_authorized"
__proto__: Object

User cancelled login or did not fully authorize. 

Facebook アプリの開発者セクションにローカル テスト用の URL を追加しました。これは Firefox でログインするため機能します。これは私のチャンネル ファイルで、http://lamp.site/channel.htmlに保存されています。

<script src="http://connect.facebook.net/en_US/all.js"></script>

src=タグにhttp:を含むチャンネル ファイルと含まないチャンネル ファイルを用意してみました。

Facebook アプリには次の設定があります。

Firefoxで動作するので、一体何が間違っているのでしょう。クロス サイト スクリプティングを有効にすることはできません。ユーザーがクロス サイト スクリプティングを有効にしないためです。これはモバイル サイトに適用されます。

最近、この問題を解決できた人はいますか?

他の同様の質問はすべて未回答です...誰かがこれを修正したに違いありません!

編集: ウェブサイトで簡略化されたバージョンの新しいアプリ ID を作成しました。

http://dev.willshawmedia.com/fb/

これは、Facebook Dev アプリケーション パネルからのアプリ ID を含むスクリーン ショットです。

Facebook 開発アプリの詳細

ソースコードを見ることができます。ここから直接コピーされています。

https://developers.facebook.com/docs/guides/web/

そしてチャンネルファイルは存在します:

http://dev.willshawmedia.com/fb/channel.html

これ以上簡単にすることはできませんが、「エラーが発生しました。後でもう一度やり直してください」というメッセージが表示されます。メッセージですが、認証して閉じるのではなく、Facebook に転送するだけです。

編集: サイトの URL がありませんでした。追加しました。簡単な例が機能しています。

私のライブ サイトで動作しているため、ローカル ドメインに関係しているに違いありません。しかし、/etc/hosts/ファイルに次の行があります。

192.168.0.13 lamp.site

これは、私のラップトップで実行されている VirtualBox Ubuntu サーバーの IP アドレスです。そのサイトは問題なく閲覧できます。

4

2 に答える 2

6

Chrome で機能させるには、サンドボックス モードを無効にする必要があります。それだけです、それだけです。

そのモードを有効にすると、検索に表示されなくなると思ったので、これは望ましくありません。そして、Firefoxで機能したので、それが問題になることはわかりませんでした。しかし、ほら、サンドボックスモードをオフにすると、すぐに機能し始めました.

サンドボックスモード

しかし、それがなぜChromeを止めているのか理解できません。

于 2012-10-14T14:53:53.233 に答える
1

あなたの工場にはいくつかの奇妙なJavaScript があります: return new function()... それ以外には問題はありません。私はこれと同じ基本的な手法を使用しており、Chrome で問題はありません。

Facebook アプリケーションがドメインに設定されていることを確認してください (「mydomain.com」と呼びましょう)。次に、ローカルでテストするには、hosts ファイルを編集して、mydomain.com が 127.0.0.1 を指すようにする必要があります。 . したがって、ブラウザーの場所の URL は、Facebook が期待するものと一致します。

それがおそらく、私がしていることとあなたがしていることの唯一の違いです。

... また、アプリ ID が Facebook アプリケーションの設定からの適切なアプリ ID であることを確認してください。再確認してください。BS「テスト」アプリ ID もエラー メッセージを表示します。

-

-


編集new function(){ }前面に...これはあなたの問題ではないと思います....もう少し説明したいと思います:

var x = new function() { this.foo = 'test'; };

と同じです

var x = { foo: 'test' };

キーワードはオブジェクト コンストラクターとして関数を呼び出すためにnew使用され、再度使用できない匿名関数で new を使用しているため、宣言する理由はありません。

したがって、スニペットは次のようになる可能性があります(おそらくそうあるべきです):

.factory('facebookConnect', function() {
    return {
        authenticate: function(fail, success) {
            FB.login(function(response) {
                console.log(response);
                if (response.authResponse) {
                    FB.api('/me', success);
                } else {
                    fail('User cancelled login or did not fully authorize.');
                }
            });
        }
    }
});
于 2012-10-12T13:17:53.093 に答える