3

私は .net で FB SDK を使用しています。私の Web サイトには、ユーザーが設定した複数の Facebook メールがあります。ユーザーが FB にメッセージを投稿したいときはいつでも、任意の電子メールを選択でき、FB にログインできるはずです。

問題は、ユーザーがすでに FB にログインしていて、別の FB アカウントにメッセージを投稿したい場合、ログイン画面を表示できず、既にログインしているアカウントにメッセージが投稿されることです。

ユーザーauth_type=reauthenticateがいますが、これも毎回ログイン画面を表示するのに役立ちませんでした。FBでログインを強制するには、Twitterのようなメカニズムが必要です。

誰でも助けてもらえますか?

4

1 に答える 1

1
  1. Facebook アプリ – アプリ ID とアプリ シークレットをメモしておきます
  2. Json.NET が Bin にインストールされます。ここからダウンロード: http://json.codeplex.com
  3. アプリをセットアップするページに次の参照を追加する必要があります。

    Newtonsoft.Json.Linq の使用; Newtonsoft.Json.Serialization の使用; System.Collections.Generic の使用; System.Security.Cryptography の使用;

  4. これは HTML コンテンツです。

     <div id="fb-root"></div>
    
    function runLogin() {
    FB.init({
    appId  : 'ENTERYOURAPPIDHERE',
    status : true,
    cookie : true,
    xfbml  : true,
    channelURL: 'ENTERTHEPAGEYOURAPPURLPOINTSTOHERE', // channel.html file 
    oauth : true 
    });
    
    <div id="dontLike">
        PAGE IS <b>NOT</b> Liked
    </div>
    
    </form>
    

ページのコード ビハインドを開きます。コード署名リクエストを検証しました。

public bool ValidateSignedRequest()
    {
        var VALID_SIGNED_REQUEST = Request.Form["signed_request"];

        string applicationSecret = "YOURAPPSECRET";
        string[] signedRequest = VALID_SIGNED_REQUEST.Split('.');
        string expectedSignature = signedRequest[0];
        string payload = signedRequest[1];

        // Attempt to get same hash
        var Hmac = SignWithHmac(UTF8Encoding.UTF8.GetBytes(payload), UTF8Encoding.UTF8.GetBytes(applicationSecret));
        var HmacBase64 = ToUrlBase64String(Hmac);

        return (HmacBase64 == expectedSignature);
    }

   private string ToUrlBase64String(byte[] Input)
    {
        return Convert.ToBase64String(Input).Replace("=", String.Empty)
                                            .Replace('+', '-')
                                            .Replace('/', '_');
    }

    private byte[] SignWithHmac(byte[] dataToSign, byte[] keyBody)
    {
        using (var hmacAlgorithm = new HMACSHA256(keyBody))
        {
            hmacAlgorithm.ComputeHash(dataToSign);
            return hmacAlgorithm.Hash;
        }
    }

 public Dictionary<string, string> DecodePayload(string payload)
    {
        //Remove the bad part of signed_request
        //Begin
        string[] sB64String = payload.Split('.');
        payload = payload.Replace((sB64String[0] + "."), string.Empty);
        //End
        var encoding = new UTF8Encoding();
        var decodedJson = payload.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/');
        var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '='));
        var json = encoding.GetString(base64JsonArray);
        var jObject = JObject.Parse(json);
        var parameters = new Dictionary<string, string>();

        parameters.Add("page", ((bool)jObject["page"]["liked"]).ToString());
        parameters.Add("admin", ((bool)jObject["page"]["admin"]).ToString());
        return parameters;
    }

protected void pageLike()
    {
        string pageLiked = string.Empty;
        var signed_request = Request.Form["signed_request"];
        var json = DecodePayload(signed_request);


        foreach (KeyValuePair<string, string> objKVP in json)
        {
            //Note You can also see if a user is an admin by replacing the objKVP.Key with admin
            if (objKVP.Key == "page" && objKVP.Value == "True")
            {
                Response.Redirect("https://www.YOURSITE.com/facebook/app/pageLiked.aspx");
                litJson.Text += objKVP.Key + " - " + objKVP.Value + "<br />";
            }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
        {
        pageLike();
    }

この例は、次のリンクで見ることができます: http://blog.daniellecopp.com/2012/03/19/detect-if-facebook-user-likes-your-page-with-asp-net-2/#comment- 52

于 2013-03-04T20:33:29.333 に答える