1

私はFacebookアプリを初めて使用し、最近利用可能なドキュメントを読みました。次に、NuGetからFacebook C#SDKを入手し、入門チュートリアルを読みました。

少し修正しました。私は3ページあります:

  • Default.aspx:「Facebookでログイン」ボタンがあります
  • Protected.aspx:最初にログインしないと最終的にアクセスできないようにしたいページ
  • DoSignIn.aspx:トークンのリクエストが含まれ、Default.aspxにリダイレクトされます

  • Default.aspxには、Protected.aspxページにリダイレクトするボタンがあります。その上に、トークンを示すラベルがあります。

今、私の問題はこれです:

  • 「Facebookでログイン」ボタンをクリックしても、ボタンは変更されず、ログインしていることを示します。ページを更新した場合にのみ、ログインしていることを示します。
  • ボタンをクリックしてProtected.aspxページにリダイレクトすると、DoSignIn.aspxページが呼び出されなかったため、ラベルにトークンが表示されません。

誰かが私が間違っていることを指摘してくれたら(チュートリアルの例をほぼコピーしたので)、私は非常に感謝しています。私は過去3時間これをいじって、グーグルとSOをあちこちで検索しました、そしてもうどこで検索するべきかわかりません。

お時間をいただきありがとうございます。

PS。最新のFacebookC#SDKを使用していますが、ブラウザーを手動で更新すると、実際にログインしているため、アプリIDは正常に機能しているようです。

3ページのコードを追加します。

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div id="fb-root">
    </div>
    <script type="text/javascript">
        window.fbAsyncInit = function () {
            FB.init({
                appId: 'I_INSERTED_MY_APP_ID_HERE', // App ID
                status: true, // check login status
                cookie: true, // enable cookies to allow the server to access the session
                xfbml: true  // parse XFBML
            });


            FB.Event.subscribe('auth.authResponseChange', function (response) {
                if (response.status === 'connected') {
                    // the user is logged in and has authenticated your
                    // app, and response.authResponse supplies
                    // the user's ID, a valid access token, a signed
                    // request, and the time the access token 
                    // and signed request each expire
                    var uid = response.authResponse.userID;
                    var accessToken = response.authResponse.accessToken;

                    // - Handle the access token -
                    // Do a post to the server to finish the logon
                    // This is a form post since we don't want to use AJAX
                    var form = document.createElement("form");
                    form.setAttribute("method", 'post');
                    form.setAttribute("action", 'DoSignIn.aspx');

                    var field = document.createElement("input");
                    field.setAttribute("type", "hidden");
                    field.setAttribute("name", 'accessToken');
                    field.setAttribute("value", accessToken);
                    form.appendChild(field);

                    document.body.appendChild(form);
                    form.submit();

                } else if (response.status === 'not_authorized') {
                    // the user is logged in to Facebook, 
                    // but has not authenticated your app
                } else {
                    // the user isn't logged in to Facebook.
                }
            });
        };

        // 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));
    </script>
    <form id="form1" runat="server">
    <div>
        <div class="fb-login-button" data-show-faces="true" data-width="400" data-max-rows="1">
            Log in with Facebook</div>
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Go to protected" />
    </div>
    </form>
</body>
</html>

Default.aspx.cs:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("Protected.aspx");
    }
}

DoSignIn.aspx.cs:

public partial class DoSignIn : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var accessToken = Request["accessToken"];
        Session["AccessToken"] = accessToken;

        Response.Redirect("Default.aspx");
    }
}

Protected.aspx.cs:

public partial class Protected : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["AccessToken"] != null)
        {
            Label1.Text = Session["AccessToken"].ToString();
        }
        else
        {

            Label1.Text = "Not authenticated";
        }
    }
4

1 に答える 1

1

そうです、私は何時間も検索に費やし、ついにそれが機能しない理由を見つけました。上記のコードとは何の関係もありませんが、Facebookのバグとは関係があります。実際、多くの人は、セッションが更新されるときにauth.authResponseChangeを起動させることができないようです。完全な問題を説明するFBに関するいくつかのバグレポートを見つけました。そのうちの1つはここにあります。

/localhost/で開発するときに発生したこの問題。上記のサンプルを削除する前に、ドメイン名で実際のホスティングサーバーにアップロードしようとしたときに、Facebookログインを統合する別の方法にすでに移行していました。説明できない理由で、それはそこから機能します。

とにかく、私が現在追求しているFacebookログインの実装はここで説明されています。

于 2012-05-01T21:44:54.430 に答える