Пример Facebook OAuth в WPF & C # [закрыто]
Я разрабатываю приложение WPF, которое требует, чтобы я получил токен доступа отFacebook использует oAuth, После долгих поисков в Интернете я пришел к следующим выводам:
OAuth нужно сделать в браузереМне нужно посмотреть сообщения URL в этом браузере, поэтому он должен быть внутриВеб-браузер WPF controlЯ решил создать модальное диалоговое окно для аутентификации в Facebook, и я могу просто взять токен доступа и игнорировать все остальное. Я хотел придерживаться модели MVVM, но это оказалось сложнее, чем я ожидал.Любые идеи о том, как это сделать, были бы очень полезны
Вот некоторые функции, которые я реализовал
Удаление cookie таким образом, другой пользователь может пройти аутентификацию без необходимости выхода из системы текущего пользователяОтключить создание новой учетной записи так как это привело к странному опыту пользовательского интерфейсаПрослушивание кнопки отмены из JavaScript, созданного FacebookОкно WPFWPF очень прост. По сути, это просто элемент управления WebBrowser с подключенными событиями Navigated и Navigating.
Код//The Application ID from Facebook
public string AppID {get; set; }
//The access token retrieved from facebook's authentication
public string AccessToken {get; set; }
public FacebookAuthenticationWindow()
{
InitializeComponent();
this.Loaded += (object sender, RoutedEventArgs e) =>
{
//Add the message hook in the code behind since I got a weird bug when trying to do it in the XAML
webBrowser.MessageHook += webBrowser_MessageHook;
//Delete the cookies since the last authentication
DeleteFacebookCookie();
//Create the destination URL
var destinationURL = String.Format("https://www.facebook.com/dialog/oauth?client_id={0}&scope={1}&display=popup&redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token",
AppID, //client_id
"email,user_birthday" //scope
);
webBrowser.Navigate(destinationURL);
};
}
Получение токена доступаЯ точно забыл, где я получил этот код (если кто-то может напомнить мне, чтобы я мог отдать должное, я был бы благодарен).
private void webBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
//If the URL has an access_token, grab it and walk away...
var url = e.Uri.Fragment;
if (url.Contains("access_token") && url.Contains("#"))
{
url = (new System.Text.RegularExpressions.Regex("#")).Replace(url, "?", 1);
AccessToken = System.Web.HttpUtility.ParseQueryString(url).Get("access_token");
DialogResult = true;
this.Close();
}
}
Удаление CookiesЯ понял, что после того, как кто-то вошел в систему, его статус остался таким же и не позволил бы кому-либо войти в систему. Я решил удалить куки в начале каждой аутентификации, чтобы предотвратить это.
private void DeleteFacebookCookie()
{
//Set the current user cookie to have expired yesterday
string cookie = String.Format("c_user=; expires={0:R}; path=/; domain=.facebook.com", DateTime.UtcNow.AddDays(-1).ToString("R"));
Application.SetCookie(new Uri("https://www.facebook.com"), cookie);
}
Нет новых аккаунтовРазрешение пользователю создавать новую учетную запись приводило к странным интерфейсам. Для моих случаев использования у пользователя уже должна быть действующая учетная запись. Я отключил это, проверив, перенаправлен ли пользователь на "r.php /» это то, что Facebook использует для создания новой учетной записи.
private void webBrowser_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
{
if (e.Uri.LocalPath == "/r.php")
{
MessageBox.Show("To create a new account go to www.facebook.com", "Could Not Create Account", MessageBoxButton.OK, MessageBoxImage.Error);
e.Cancel = true;
}
}
Обработка window.close ()Кнопка отмены в FacebookДиалоговое окно показывает возможность закрыть окно. Мне нужно было поймать это и обязательно закрыть окно. Я понятия не имел, как, но я увидел, что в MessageHook я мог видеть, что последнее сообщение, которое будет отправлено (int msg) каждый раз, было 130, поэтому я просто слушал 130.неаккуратно, но это работает.
IntPtr webBrowser_MessageHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
//msg = 130 is the last call for when the window gets closed on a window.close() in javascript
if (msg == 130)
{
this.Close();
}
return IntPtr.Zero;
}
РезюмеИспользовать код довольно просто
FacebookAuthenticationWindow dialog = new FacebookAuthenticationWindow() { AppID = "YOURAPPID" };
if(dialog.ShowDialog() == true)
{
string accessToken = dialog.AccessToken;
//The world is your oyster
}
Я надеюсь, что этот пример полезен для сообщества. Я действительно хотел бы услышать от любого, кто имеет какие-либо улучшения, понимание или даже критику.
~ Mo