Попытка авторизации приложения Facebook Canvas в веб-формах ASP.net - PullRequest
1 голос
/ 13 февраля 2012

У меня работали некоторые приложения Page Tab, только базовая авторизация, поскольку мне ничего не нужно, кроме имени / идентификатора для того, что я делаю, - но я попробовал тот же метод с приложением canvas, и он не работает,Похоже, что с перенаправлением назад, и я действительно не вижу, где я иду не так, основываясь на документации Facebook для приложений холста http://developers.facebook.com/docs/appsonfacebook/tutorial/#auth

При загрузке я показываю кнопку, при нажатиичто он пытается получить разрешение, но он не работает.Я проверил и дважды проверил, что я использую URL-адрес холста в качестве перенаправления, но все, что я получаю, это 404 (что неправильно, поскольку страница определенно существует, иначе кнопка не появится).URL на странице 404 это то, что меня действительно смущает, это:

http://apps.mydomain.co.uk/myappname/https%3a%2f%2fwww.facebook.com%2fdialog%2foauth%3fclient_id%3d999999999999%26redirect_uri%3dhttp%253a%252f%252fapps.mydomain.co.uk%252fmyappname%252f

Это должно быть как-то связано сперенаправление - любая помощь приветствуется.

Вот мой код (сокращен для ясности, URL-адреса изменены):

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string error = Request.QueryString["error_reason"];

        if (String.IsNullOrEmpty(error))
        {
            if (Request.Form["signed_request"] != null)
            {
                signedRequest();
            }

            if (String.IsNullOrEmpty(_auth))
            {
                intro.Visible = true;
                main.Visible = false;
            }
            else
            {
                intro.Visible = false;
                main.Visible = true;
            }
        }
        else
        {
            //  show intro page
            intro.Visible = true;
            main.Visible = false;
        }
    }
}

protected void Authorise_Click(object sender, EventArgs e)
{
    //  redirect if needs auth
    if (String.IsNullOrEmpty(_auth))
    {
        //  get authorisation
        string id = "999999999999";
        string canvas = Server.UrlEncode("http://apps.mydomain.co.uk/myappname/");

        string redir = Server.UrlEncode("https://www.facebook.com/dialog/oauth?client_id="+ id +"&redirect_uri=" + canvas); // test

        Response.Write("<script>top.location.href='" + redir + "'</script>");
    }
    else
    {
        //  already authorised
        //  go straight to main page

    }
}

private void signedRequest()
{
    string sreq = Request.Form["signed_request"];

    string[] splitPayload = sreq.Split('.');
    string sig = splitPayload[0];
    string payload = splitPayload[1];

    Dictionary<string, string> JSONpayload = DecodePayload(payload);

    _auth = JSONpayload["user_id"].ToString();
    _code = JSONpayload["oauth_token"].ToString();

    if (!String.IsNullOrEmpty(JSONpayload["oauth_token"]))
    {
        var fb = new FacebookClient(JSONpayload["oauth_token"]);

        var result = (IDictionary<string, object>)fb.Get("/me");
        _name = (string)result["name"];

        //Response.Write("<br /><br />RESULT: " + result);

        ViewState["name"] = _name;
        Session["name"] = _name;
    }

    ViewState["id"] = _auth;
    Session["id"] = _auth;
}

private Dictionary<string, string> DecodePayload(string payload)
{
    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);
    Response.Write("jObject: " + jObject);

    var parameters = new Dictionary<string, string>();
    parameters.Add("user_id", (string)jObject["user_id"] ?? "");
    parameters.Add("oauth_token", (string)jObject["oauth_token"] ?? "");
    var expires = ((long?)jObject["expires"] ?? 0);
    parameters.Add("expires", expires > 0 ? expires.ToString() : "");
    parameters.Add("profile_id", (string)jObject["profile_id"] ?? "");

    if (jObject["page"] != null)
    {
        var jObjectPage = JObject.Parse(jObject["page"].ToString());
        bool isPageLiked = bool.Parse(jObjectPage["liked"].ToString());
        parameters.Add("is_Liked", isPageLiked.ToString() ?? "");
    }
    else
    {
        _liked = false;
    }
    return parameters;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...