background img

The New Stuff

Windows Phone - авторизация Facebook

Долго искал как сделать авторизацию в Facebook для WP8, нашел несколько примеров, некоторые из них даже работали, но либо с глюками, либо слишком много коду и непонятной человечестве логике. Решил написать свой вариант авторизации, много писать не буду что и как работает, сами разберетесь, или пишите в комментариях свои вопросы, рад буду ответить.

Вот, собственно, и весь код для прохождения авторизации с помощью компонента WebBrowser, если все хорошо и авторизация пройдена вы получаете accessToken и переходите на новую страницу.

public string AccessToken { get; set; }
private static String appId = "ID apps/API key";
private static String scope = "publish_stream";
private static String secret = "App Secret";

public static string AuthUri
{
    get
    {
        return "https://facebook.com/dialog/oauth?client_id=" + appId +
                "&redirect_uri=https://www.facebook.com/connect/login_success.html&scope=" + scope +
                "&display=touch&client_secret=" + secret;
    }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    AuthBrowser.Navigate(new Uri(AuthUri));
}

private void AuthBrowser_OnNavigated(object sender, NavigationEventArgs e)
{
    String uri = e.Uri.ToString();
    if (uri.StartsWith("https://www.facebook.com/connect/login_success.html"))
    {
        if (uri.EndsWith("#_=_"))
            uri = uri.Substring(0, uri.Length - 4);
    }
    string codeValue = uri.Replace("https://www.facebook.com/connect/login_success.html?", "");
    var url = "https://graph.facebook.com/oauth/access_token?client_id=" + appId +
        "&redirect_uri=https://www.facebook.com/connect/login_success.html&client_secret=" + secret + "&" + codeValue;

    AccessTokenRead(url);
}

public void AccessTokenRead(string uri)
{
    var clientToken = new WebClient();
    clientToken.OpenReadCompleted += clientToken_OpenReadCompleted;
    clientToken.OpenReadAsync(new Uri(uri));
}

private void clientToken_OpenReadCompleted(object sender, OpenReadCompletedEventArgse)
{
    if (e.Error == null)
    {
        try
        {
            Stream reply = e.Result;
            StreamReader reader = new StreamReader(reply);

            string[] tokens = reader.ReadToEnd().Split(new[] { "=", "&" }, StringSplitOptions.None);
            for (int index = 0; index < tokens.Length; index++)
            {
                AccessToken = tokens[1];
            }
        }
        finally
        {
            if (AccessToken != null)
            {
                string destination = string.Format("/TokenPage.xaml?access_token={0}", AccessToken);
                NavigationService.Navigate(new Uri(destination, UriKind.Relative));
            }
        }
    }
}

Ну и в XAML размещен только компонент WebBrowser с обработанным событием Navigated.
Как получить данные со страницы TokenPage надеюсь знаете :)
P.S. в поля appId, scope, secret вам нужно вставить собственные данные которые вы получаете при регистрации нового приложения для facebook. 
Проект на GitHub
Удачи в ПРОграммировании.
Долго искал как сделать авторизацию в Facebook для WP8, нашел несколько примеров, некоторые из них даже работали, но либо с глюками, либо слишком много коду и непонятной человечестве логике. Решил написать свой вариант авторизации, много писать не буду что и как работает, сами разберетесь, или пишите в комментариях свои вопросы, рад буду ответить.

Вот, собственно, и весь код для прохождения авторизации с помощью компонента WebBrowser, если все хорошо и авторизация пройдена вы получаете accessToken и переходите на новую страницу.

public string AccessToken { get; set; }
private static String appId = "ID apps/API key";
private static String scope = "publish_stream";
private static String secret = "App Secret";

public static string AuthUri
{
    get
    {
        return "https://facebook.com/dialog/oauth?client_id=" + appId +
                "&redirect_uri=https://www.facebook.com/connect/login_success.html&scope=" + scope +
                "&display=touch&client_secret=" + secret;
    }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    AuthBrowser.Navigate(new Uri(AuthUri));
}

private void AuthBrowser_OnNavigated(object sender, NavigationEventArgs e)
{
    String uri = e.Uri.ToString();
    if (uri.StartsWith("https://www.facebook.com/connect/login_success.html"))
    {
        if (uri.EndsWith("#_=_"))
            uri = uri.Substring(0, uri.Length - 4);
    }
    string codeValue = uri.Replace("https://www.facebook.com/connect/login_success.html?", "");
    var url = "https://graph.facebook.com/oauth/access_token?client_id=" + appId +
        "&redirect_uri=https://www.facebook.com/connect/login_success.html&client_secret=" + secret + "&" + codeValue;

    AccessTokenRead(url);
}

public void AccessTokenRead(string uri)
{
    var clientToken = new WebClient();
    clientToken.OpenReadCompleted += clientToken_OpenReadCompleted;
    clientToken.OpenReadAsync(new Uri(uri));
}

private void clientToken_OpenReadCompleted(object sender, OpenReadCompletedEventArgse)
{
    if (e.Error == null)
    {
        try
        {
            Stream reply = e.Result;
            StreamReader reader = new StreamReader(reply);

            string[] tokens = reader.ReadToEnd().Split(new[] { "=", "&" }, StringSplitOptions.None);
            for (int index = 0; index < tokens.Length; index++)
            {
                AccessToken = tokens[1];
            }
        }
        finally
        {
            if (AccessToken != null)
            {
                string destination = string.Format("/TokenPage.xaml?access_token={0}", AccessToken);
                NavigationService.Navigate(new Uri(destination, UriKind.Relative));
            }
        }
    }
}

Ну и в XAML размещен только компонент WebBrowser с обработанным событием Navigated.
Как получить данные со страницы TokenPage надеюсь знаете :)
P.S. в поля appId, scope, secret вам нужно вставить собственные данные которые вы получаете при регистрации нового приложения для facebook. 
Проект на GitHub
Удачи в ПРОграммировании.

0 коммент.:

Отправить комментарий

Popular Posts