Как получить токен доступа с помощью C # SDK - PullRequest
7 голосов
/ 28 марта 2012

Я обновил Facebook SDK до 6.0.10, и некоторый код, который раньше работал, больше не работает.Раньше я размещал на стене пользователя, используя метод, описанный ниже.

Класс FacebookClient, используемый для взятия AppId и AppSecret, и я не дал ему токен доступа для своего приложения.

string uId = "SomeUid";
FacebookClient fb = new FacebookClient(AppId,AppSecret );

string userFeedPath = String.Format("/{0}/feed", uId);

dynamic parameters = new ExpandoObject();
parameters.link = "Test@test";
parameters.message = "test";

try
{
    dynamic result = fb.Post(userFeedPath, parameters);
}
catch(Exception ex)
{

}

Теперь, даже если я попробую это,

FacebookClient fb = new FacebookClient();

fb.AppId = "1234...";
fb.AppSecret = "76e69e0c334995cecc8c....";

Я получаю эту ошибку:

(OAuthException - # 200) (# 200) ЭтоДля вызова API требуется действительный идентификатор приложения.

Как мне исправить эту проблему?

Ответы [ 6 ]

31 голосов
/ 29 марта 2012

Вы должны получить токен доступа к приложению, сделав запрос.

var fb = new FacebookClient();
dynamic result = fb.Get("oauth/access_token", new { 
    client_id     = "app_id", 
    client_secret = "app_secret", 
    grant_type    = "client_credentials" 
});
fb.AccessToken = result.access_token;
4 голосов
/ 27 апреля 2012

Для кода -> обмен токенов доступа пользователя в потоке на стороне сервера - вместо этого (версия 5):

    FacebookOAuthClient oAuthClient = new FacebookOAuthClient();
    oAuthClient.AppId = "...";
    oAuthClient.AppSecret = "...";
    oAuthClient.RedirectUri = new Uri("https://.../....aspx");

    dynamic tokenResult = oAuthClient.ExchangeCodeForAccessToken(code);
    return tokenResult.access_token;

Теперь используйте (версия 6):

    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("client_id", "...");
    parameters.Add("redirect_uri", "https://.../....aspx");
    parameters.Add("client_secret", "...");
    parameters.Add("code", code);

    result = fb.Get("/oauth/access_token", parameters);

    string accessToken = result["access_token"];

(см .: http://developers.facebook.com/docs/authentication/server-side/)

3 голосов
/ 26 мая 2012

Вчера я только начал использовать эту библиотеку Facebook и подумал, что отсутствие возможности дать мне токен доступа без перехода из JavaScript является серьезным недостатком.Вот помощник, который может получить токен доступа.Я надеюсь, что это поможет всем, у кого были такие же разочарования, как и у меня.Я думаю, что все это должно работать нормально.У меня было что-то похожее, работавшее на веб-сайте, прежде чем я обнаружил Facebook NuGet , который работал нормально примерно год.

Если есть лучший способ, пожалуйста, сообщите мне.

public class FacebookHelper
{
    private string _appId;
    private string _appSecret;
    private string _accessToken;

    public string AccessToken
    {
        get
        {
            if (_accessToken == null)
                GetAccessToken();

            return _accessToken;
        }
        set { _accessToken = value; }
    }

    public FacebookHelper(string appId, string appSecret)
    {
        this._appId = appId;
        this._appSecret = appSecret;
    }

    public string GetAccessToken()
    {
        var facebookCookie = HttpContext.Current.Request.Cookies["fbsr_" + _appId];
        if (facebookCookie != null && facebookCookie.Value != null)
        {
            string jsoncode = System.Text.ASCIIEncoding.ASCII.GetString(FromBase64ForUrlString(facebookCookie.Value.Split(new char[] { '.' })[1]));
            var tokenParams = HttpUtility.ParseQueryString(GetAccessToken((string)JObject.Parse(jsoncode)["code"]));
            _accessToken = tokenParams["access_token"];
            return _accessToken;
        }
        else
            return null;

       // return DBLoginCall(username, passwordHash, cookieToken, cookieTokenExpires, args.LoginType == LoginType.Logout, null);
    }

    private string GetAccessToken(string code)
    {
        //Notice the empty redirect_uri! And the replace on the code we get from the cookie.
        string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}", _appId, "", _appSecret, code.Replace("\"", ""));

        System.Net.HttpWebRequest request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
        System.Net.HttpWebResponse response = null;

        try
        {
            using (response = request.GetResponse() as System.Net.HttpWebResponse)
            {
                System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream());

                string retVal = reader.ReadToEnd();
                return retVal;
            }
        }
        catch
        {
            return null;
        }
    }

    private byte[] FromBase64ForUrlString(string base64ForUrlInput)
    {
        int padChars = (base64ForUrlInput.Length % 4) == 0 ? 0 : (4 - (base64ForUrlInput.Length % 4));
        StringBuilder result = new StringBuilder(base64ForUrlInput, base64ForUrlInput.Length + padChars);
        result.Append(String.Empty.PadRight(padChars, '='));
        result.Replace('-', '+');
        result.Replace('_', '/');
        return Convert.FromBase64String(result.ToString());
    }
}
1 голос
/ 25 февраля 2016

Существует еще один метод для вызова API Graph, который не требует использования сгенерированного токена доступа к приложению. Вы можете просто передать свой идентификатор приложения и секрет приложения в качестве параметра access_token при вызове:

https://graph.facebook.com/endpoint?key=value&access_token=app_id|app_secret

Выбор сгенерированного токена доступа по сравнению с этим методом зависит от где вы прячете свой секрет приложения.

От: https://developers.facebook.com/docs/facebook-login/access-tokens

var client = new FacebookClient($"{appId}|{appSecret}");
1 голос
/ 14 июня 2014

Я попробовал некоторые из приведенных выше примеров только для того, чтобы выяснить, что динамическая компиляция не выполняется с помощью xamarin studio. Вот что я сделал.

public class AccessTokenModel
{
    public string Access_Token { get; set;}
}

var fb = new FacebookClient();
var result = fb.Get ("oauth/access_token", new { 
    client_id     = App.FaceBookId, 
    client_secret = App.FacebookAppSecret, 
    grant_type    = "client_credentials" 
});
var accessToken = Newtonsoft.Json.JsonConvert.DeserializeObject<AccessTokenModel> (result.ToString ());

или

FBSession.ActiveSession.AccessTokenData.AccessToken;
0 голосов
/ 20 мая 2016

Заяц - настоящий рабочий метод:

protected override string QueryAccessToken(Uri returnUrl, string authorizationCode)
        {
            // Note: Facebook doesn't like us to url-encode the redirect_uri value
            var builder = new UriBuilder("https://graph.facebook.com/oauth/access_token");
            builder.AppendQueryArgument("client_id", this.appId);
            builder.AppendQueryArgument("redirect_uri", NormalizeHexEncoding(returnUrl.GetLeftPart(UriPartial.Path)));
            builder.AppendQueryArgument("client_secret", this.appSecret);
            builder.AppendQueryArgument("code", authorizationCode);

            using (WebClient client = new WebClient())
            {
                //Get Accsess  Token
                string data = client.DownloadString(builder.Uri);
                if (string.IsNullOrEmpty(data))
                {
                    return null;
                }

                var parsedQueryString = HttpUtility.ParseQueryString(data);
                return parsedQueryString["access_token"];
            }
        }
 private static string NormalizeHexEncoding(string url)
        {
            var chars = url.ToCharArray();
            for (int i = 0; i < chars.Length - 2; i++)
            {
                if (chars[i] == '%')
                {
                    chars[i + 1] = char.ToUpperInvariant(chars[i + 1]);
                    chars[i + 2] = char.ToUpperInvariant(chars[i + 2]);
                    i += 2;
                }
            }
            return new string(chars);
        }
...