FacebookRedirect.axd не сохраняет строку запроса? - PullRequest
0 голосов
/ 17 января 2011

Я использую последнюю версию fb sdk iframe canvas 4.2.1 и столкнулся с проблемой, когда пользователь впервые заходит на мой сайт по URL, по которому они могут щелкнуть через стену своих друзей:

http://apps.facebook.com/<mysite>/Video/View/23?ItemID=8

Я предоставляю приложению основные разрешения, но URL-адрес возврата выглядит следующим образом:

http://apps.facebook.com/<mysite>/Video/View/23

Это полностью отрублено ItemID ???

Это ошибка в SDK? Если да, то как мне это исправить?

Мой маршрут настроен как:

routes.MapRoute(
"ViewItem",
"{controller}/{action}/{ItemID}/{TR}",
new { controller = "Video", action = "View", TR = UrlParameter.Optional }
);

Начало действия моего контроллера выглядит так:

[HttpPost]
[CanvasAuthorize]
public ActionResult View(long ItemID, long? TR)
{
...

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

Я попытался пройтись по коду, чтобы увидеть, где я ошибаюсь, но не могу его найти, самое близкое, к чему я пришел, это то, что файл facebookredirect.axd - это последняя вызываемая вещь, и где-то внутри нее, это все набивает!

Буду признателен за любую помощь или совет

спасибо ...

<< ОБНОВЛЕНИЕ >>

С тех пор я написал еще одно действие для проверки и получения необходимых разрешений для определенного процесса.

[HttpPost]
public ActionResult RequestPermission(string Permission, string ReturnUrl, long? TR)
{
FacebookApp app = new FacebookApp();
var authorizer = new CanvasAuthorizer(app);

if (Permission.Length > 0)
{
authorizer.Perms = Permission;
authorizer.ReturnUrlPath = Server.UrlDecode(ReturnUrl);
authorizer.Authorize();
}
return new EmptyResult();
}

Я получаю сообщение об ошибке «Обнаружен потенциально опасный путь запроса» от asp.net.

URL в адресной строке выглядит так:

http://www.<myinternetsite>.com/facebookredirect.axd//<myfacebookapp>/http://apps.facebook.com/<myfacebookapp>/Video/View/108?perms=email&selected_profiles=55424639&session={%22session_key%22%3A%111.PfJ_2D8Q8a71orTjpzWGFQ__.3600.1295251200-763424639%22%2C%22uid%3A%22763424639%22%2C%22expires%22%3A1295251200%2C%22secret%22%3A%22Chi8iKzFqQg9zb8vdMPNag__%22%2C%22access_token%22%3A%22124828944240034|2.PfJ_2Dfdfdf1orTjpzPHFQ__.3600.4343451200-343424639|S4-dr00eU6GXUmoatU7QOWGGUVE%22%2C%22sig%22%3A%22322985031c75727b9fe31993dd2e3%22}

Примечание. Я намеренно изменил некоторые коды и символы, указанные выше, чтобы предотвратить взлом моего сайта.

Одна вещь, которую я уже могу заметить в приведенном выше URL-адресе, это обратный URL-адрес:

http://apps.facebook.com/<myfacebookapp>/Video/View/108?perms=email...

что должно читаться так:

http://apps.facebook.com/<myfacebookapp>/Video/View/108?ItemID=11&perms=email...

обратите внимание, как мой ItemID удаляется CanvasAuthorizer. Это, очевидно, ошибка, этого не следует делать! Оставь эту чертову вещь в покое!

Возможно, авторизатору нужен URL для кодирования моего returnUrl ???

Любая помощь здесь ???

Ответы [ 2 ]

1 голос
/ 18 января 2011

Это ограничение в системе входа в Facebook, а не в C # SDK Facebook.Facebook удаляет строки запросов при авторизации.Это будет исправлено, когда мы внедрим новую систему аутентификации, которая использует полную спецификацию oauth 2.

0 голосов
/ 27 января 2011

Понятия не имею, в какой момент авторы Facebook C # SDK решили, что это ограничение самого Facebook. Просто для эксперимента я взломал CanvasUrlBuilder.BuildAuthReturnUrl (), чтобы включить запрос вместо того, чтобы убрать его (часть uriBuilder.Query = null; // Запрещены строки запросов в URL-адресах возврата).

Можете ли вы угадать, что случилось? Это сработало! По всей видимости, в какой-то момент обратный URL кодируется, и Facebook с радостью передает все параметры запроса.

Итак, да ...

EDIT: Вот исправленный метод. Откройте Facebook.Web.CanvasUrlBuilder и замените BuildAuthReturnUrl этим. Это сохранит все параметры запроса при входе в FB и / или авторизации приложения. Я не совсем уверен, но эта реализация может сломать что-то, связанное с отменой во время процесса, так как она полностью обходит FacebookRedirect.axd. YMMV, поскольку у меня больше нет проблем с FB C # SDK.

    private Uri BuildAuthReturnUrl(string pathAndQuery, bool cancel)
    {
        Contract.Ensures(Contract.Result<Uri>() != null);


        if (!string.IsNullOrEmpty(pathAndQuery) && pathAndQuery.StartsWith("/", StringComparison.Ordinal))
        {
            pathAndQuery = pathAndQuery.Substring(1);
        }

        if (pathAndQuery == null)
        {
            pathAndQuery = CurrentCanvasPathAndQuery;
        }

        string path, query;
        if (pathAndQuery.Contains('?'))
        {
            string[] strings = pathAndQuery.Split('?');
            path = strings[0];
            query = strings[1];
        }
        else
        {
            path = pathAndQuery;
            query = null;
        }

        if (!path.StartsWith("/", StringComparison.Ordinal))
        {
            path = "/" + path;
        }

        var appPath = request.ApplicationPath;
        if (appPath != "/")
        {
            appPath = string.Concat(appPath, "/");
        }

        string redirectRoot = string.Concat(redirectPath, "/", cancel ? "cancel" : string.Empty);

        UriBuilder uriBuilder = new UriBuilder("http://apps.facebook.com");
        //uriBuilder.Path = string.Concat(appPath, redirectRoot, CanvasPageApplicationPath, path);
        uriBuilder.Path = string.Concat(CanvasPageApplicationPath, path);
        uriBuilder.Query = query; // No Querystrings allowed in return urls
        return uriBuilder.Uri;
    }
...