(Facebook C # SDK) Проблема с получением токена доступа - PullRequest
2 голосов
/ 11 марта 2011

Я довольно новичок в Facebook C # SDK (5.0.3), что, вероятно, является причиной этого вопроса.По сути, я пытаюсь получить профиль текущего пользователя, адрес электронной почты, фотографию и т. Д. И т. Д. Ниже вы найдете код для моих двух страниц (MyLogin.aspx и landingpage.aspx).Я использую веб-формы купить путь.

На первой странице отображается кнопка входа в систему, а затем перенаправляется на целевую страницу.Смотрите мои комментарии в коде для получения дополнительной информации.Я получаю различные исключения, которые я не знаю, как решить.

Если у вас есть какие-либо рекомендации, которые позволяют мне двигаться вперед, я очень благодарен за это.

Итак, вот код ...

MyLogin.aspx.cs

    protected void DoLogin(object sender, EventArgs e)
    {
        Response.Redirect(GetFacebookLoginUrl());
    }


    private static string GetFacebookLoginUrl()
    {
        try
        {
            const string baseUrl = "http://localhost:5000/";
            var extendedPermissions = new[] { "offline_access", "publish_stream" };

            var oauth = new FacebookOAuthClient
            {
                ClientId = FacebookContext.Current.AppId
            };

            //If I use token instead of code the FacebookOAuthResult.TryParse will return false.
            var parameters = new Dictionary<string, object>{{ "response_type", "code" },{ "display", "page" }};

            if (extendedPermissions != null && extendedPermissions.Length > 0)
            {
                var scope = new StringBuilder();
                scope.Append(string.Join(",", extendedPermissions));

                parameters["scope"] = scope.ToString();
            }
            parameters["redirect_uri"] = String.Format("{0}LandingPage.aspx", baseUrl);
            var url = oauth.GetLoginUrl(parameters).OriginalString;
            return url;
        }
        catch (Exception)
        {
            return string.Empty;
        }
    }

... и вот страница, где все это, похоже, дошло до $ "! @@ %% ... если вы понимаете, о чем я.

Landingpage.aspx.cs

    protected void Page_Load(object sender, EventArgs e)
    {
        var cl = new FacebookOAuthClient(FacebookContext.Current);
        FacebookOAuthResult result = null;
        var url = Request.Url.AbsoluteUri;

        if (!FacebookOAuthResult.TryParse(url, out result)) return;
        if (result.IsSuccess)
        {
            //result.AccessToken is null, that's why I create a new instance of FacebookClient to get hold of the AccessToken.
            var accessToken1 = result.AccessToken;

            var app = new FacebookClient(FacebookContext.Current.AppId, FacebookContext.Current.AppSecret);
            var accessToken2 = app.AccessToken;

            //I now got an AccessToken but when I call client.Get("me");
            // I'll get (OAuthException) An active access token must be used to query information about the current user.

            //var client = new FacebookClient(accessToken2);
            //dynamic me = client.Get("me");
            //string firstName = me.first_name;
            //string lastName = me.last_name;
            //string email = me.email;

            // So, how do I get an active access token? 
            // Well, I did try using the FacebookOAuthClient object and the method ExchangeCodeForAccessToken (as you can see below).


            cl.ClientId = FacebookContext.Current.AppId;
            cl.ClientSecret = FacebookContext.Current.AppSecret;
            cl.RedirectUri = new UriBuilder("http://localhost:5000/").Uri;

            var parameters = new Dictionary<string, object> { { "permissions", "offline_access" } };
            var x = cl.ExchangeCodeForAccessToken(result.Code, parameters);

            //However, this now gives me the Exception (OAuthException) Error validating verification code.

        }
        else
        {
            var errorDescription = result.ErrorDescription;
            var errorReason = result.ErrorReason;
        }
    }

Спасибо !!

// Nicke

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

И в запросе кода, и в запросе маркера доступа значение redirect_uri должно быть одинаковым, это в конечном итоге исправит OAuthException. Мой код теперь что-то вроде:

...    
if (result.IsSuccess)
{
    var tokenresult = cl.ExchangeCodeForAccessToken(result.Code, new Dictionary<string, object> { { "redirect_uri", "<your_redirect_uri>" } });
}
...
2 голосов
/ 01 июня 2011

Ваш код по большей части правильный, единственное, чего вам не хватало, это параметра «redirect_uri» при вызове метода «ExchangeCodeForAccessToken».Это должно соответствовать URL-адресу приложения, который вы установили при регистрации приложения Facebook.В противном случае вы получите ошибку, которую получили.Вам не нужен параметр «permissions», вы уже получили его во время предыдущей авторизации.

 Dictionary<string, object> parameters = new Dictionary<string, object>();
 parameters.Add("redirect_uri", "http://www.yourcallbackurl.com/");
 var result = cl.ExchangeCodeForAccessToken(result.code,parameters);
2 голосов
/ 12 марта 2011

Мне кажется, проблема в том, что вы никогда не получаете токен доступа пользователя, а получаете только токен доступа к приложению.В автономном приложении вам нужно использовать диалог oAuth.Простейший способ сделать это - использовать Javascript SDK .

Facebook C # SDK имеет образец , который показывает вам, как это сделать.Вы можете загрузить весь пример приложения (CSASPNETWebsite) в качестве отправной точки.

...