0

たくさんのFBドキュメントを読みましたが、それでもこれを機能させることができません。

IFrameで実行しているFBアプリがあります。JSSDKを使用してユーザーを認証しています。そのため、ユーザーが以前に私のアプリを使用したことがない場合は、承認を求めるプロンプトを表示する必要があります。

使ってみFB.Login()ましたが、これには2つの大きな問題があります。

  1. 醜いポップアップが開きます
  2. ログイン画面を自動的に表示したい(つまり、ユーザーがもう一度クリックする必要がない)

そこで、代わりにクライアントのOAuthダイアログに再接続してみました。これを機能させるには、OAuth URLをトップウィンドウで開く必要があります。つまり、redirect_uriをapps.facebook.com/myappとして渡す必要があります。

問題は、これがプロトコルとしてhttpsを使用する場合にのみ機能することです。ただし、ユーザーがすでにhttp経由でFacebookを使用している場合は、httpsに切り替えたくありません。

これが私のコードです:

window.fbAsyncInit = function () {
    FB.init({
        appId: 1234567890,
        channelUrl: "//mydomain.com/channel.html",
        status: true,
        cookie: true,
        xfbml: true
    });

    FB.Event.subscribe('auth.statusChange', function (response) {
        console.log(response);
        if (response.status === "connected") {
            // User has authorized app
        } else if (response.status === "not_authorized") {
            var url = "//www.facebook.com/dialog/oauth?";
            var queryParams = ["client_id=1234567890",
                  "redirect_uri=//apps.facebook.com/myapp",  // NOT WORKING
                  "response_type=token"];
            var queryString = queryParams.join("&");
            url += queryString;
            window.top.location = url;
        }
    });
};

OAuthダイアログを使用してクライアント側のフローを使用して認証する方法はありますか?それとも私はこれを完全に間違った方法で行っていますか?

(PS Facebook C#SDKのv6によると、推奨される方法はクライアントで認証し、クライアントからサーバーにaccess_tokenを渡すことであるため、サーバー側のフローを使用したくありません)

4

2 に答える 2

0

"redirect_uri=//apps.facebook.com/myapp", // NOT WORKING

–それはあなたの主な問題ですか?その場合、JS を使用して iframe 内でアプリの URL をリクエストする際に使用されるプロトコルを簡単に読み取ることができます。それは location.protocol プロパティ内にあります。はい、アプリで使用されるプロトコルは、ユーザーが Facebook Web サイトを閲覧するために使用したものと一致します ;-)

于 2012-06-08T14:44:25.793 に答える
0

「Facebook C# SDK の v6」を聞かないことをお勧めします。

やりたいことを説明しているのは、「サーバー側の認証フロー」です。
あなたがすべきことは、サーバー側のフローを実装することです。次に、ユーザーがアプリにアクセスしたときに、サーバー認証の後、fb js sdk をロードし、次のようにクライアント側のトークンを取得します。

FB.getLoginStatus(function(response) {
    if (response.status === "connected") {
        // response.authResponse has everything you need like signed request, access token, etc
        // you can also make FB.api request or use FB.ui which will use the client side token
    }
    else {
        // user is either logged out of facebook or hasn't authenticated your app
        // should not happen if the user went through the server side authentication
    }
});

このコードは、新しいウィンドウをポップアップ表示しないため、ユーザーがページを操作する必要はありません。
ここで、アプリのクライアント側の部分は、サーバー上にある必要があるトークンとは異なるトークンを使用し、2 つのトークンの有効期限が異なることに注意してください (クライアントが短い間、サーバーは長く存続します)。
このアプローチは、認証データをクライアントからサーバーに、またはその逆に送信する必要がないため、私の意見ではより適切で安全です。

于 2012-06-08T13:26:13.997 に答える