using Microsoft.Identity.Client; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Data.Json; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.Security.Authentication.Web; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // 空白ページの項目テンプレートについては、https://go.microsoft.com/fwlink/?LinkId=234238 を参照してください namespace MicrosoftGraph { /// <summary> /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。 /// </summary> public sealed partial class Profile : Page { public Content ViewModel { get; set; } public Profile() { this.InitializeComponent(); ViewModel = new Content(); } private async void AuthLauncher_Click(object sender, RoutedEventArgs e) { if (SyncDistinationArea.SelectedValue == null) return; string oauthURL = string.Empty; string redirectURL = string.Empty; string result = string.Empty; string scope = string.Empty; ProviderBase provider = (SyncDistinationArea.SelectedValue as ProviderBase).CurrentProvider; ViewModel.CurrentProvider = provider; #region Set provider user selected switch (provider.CurrentProviderTypes) { case ProviderBase.ProviderTypes.FaceBook: oauthURL = (provider as Facebook).OAuthRequestURL; redirectURL = (provider as Facebook).RedirectURL; break; case ProviderBase.ProviderTypes.MicrosoftGraph: oauthURL = (provider as MSGraph).OAuthRequestURL; redirectURL = (provider as MSGraph).RedirectURL; break; default: oauthURL = (provider as Facebook).OAuthRequestURL; redirectURL = (provider as Facebook).RedirectURL; break; } #endregion try { System.Uri StartUri = new Uri(oauthURL); System.Uri EndUri = new Uri(redirectURL); switch (provider.CurrentProviderTypes) { case ProviderBase.ProviderTypes.MicrosoftGraph: var oAuthClient = AuthenticationHelper.GetAuthenticatedClient(); if (oAuthClient != null) { var user = await oAuthClient.Me.Request().GetAsync(); (provider as MSGraph).AccessToken = AuthenticationHelper.TokenForUser; (provider as MSGraph).TokenExpire = AuthenticationHelper.Expiration; result = user.GivenName; } else { result = "Internal Error when creating OAuth client"; } NotifyUser(result); break; default: break; } //WebAuthenticationResult WebAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, StartUri, EndUri); //if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success) //{ // #region Get access token from request result // string aquireTakenResult = WebAuthenticationResult.ResponseData.ToString(); // string responseData = aquireTakenResult.Substring(aquireTakenResult.IndexOf("access_token")); // String[] keyValPairs = responseData.Split('&'); // provider.AccessToken = null; // string expires_in = null; // for (int i = 0; i < keyValPairs.Length; i++) // { // String[] splits = keyValPairs[i].Split('='); // switch (splits[0]) // { // case "access_token": // provider.AccessToken = splits[1]; // break; // case "expires_in": // expires_in = splits[1]; // break; // } // } // #endregion // SetDisplayElements(provider); // NotifyUser(ViewModel.FirstName); //} //else if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.ErrorHttp) //{ // result = "HTTP Error returned by AuthenticateAsync() : " + WebAuthenticationResult.ResponseErrorDetail.ToString(); //} //else //{ // result = "Error returned by AuthenticateAsync() : " + WebAuthenticationResult.ResponseStatus.ToString(); //} } catch (Exception Error) { result = "ErrorMessage" + Error.Message; } } public void NotifyUser(string strMessage) { if (Dispatcher.HasThreadAccess) { FirstName.Text = strMessage; } else { var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { FirstName.Text = strMessage; }); } } private async void SetDisplayElements(ProviderBase provider) { HttpClient httpClient = new HttpClient(); switch (provider.CurrentProviderTypes) { case ProviderBase.ProviderTypes.FaceBook: string response = await httpClient.GetStringAsync(new Uri((provider as Facebook).PublicProfileRequestURL)); JsonObject value = JsonValue.Parse(response).GetObject(); if (value.Keys.Where(k => k == "age_range").Count() > 0) { (provider as Facebook).Public_Profile.age_range = value.GetNamedString("age_range"); } if (value.Keys.Where(k => k == "cover").Count() > 0) { (provider as Facebook).Public_Profile.cover = value.GetNamedString("cover"); } if (value.Keys.Where(k => k == "first_name").Count() > 0) { (provider as Facebook).Public_Profile.first_name = value.GetNamedString("first_name"); ViewModel.FirstName = value.GetNamedString("first_name"); } if (value.Keys.Where(k => k == "gender").Count() > 0) { (provider as Facebook).Public_Profile.gender = value.GetNamedString("gender"); } if (value.Keys.Where(k => k == "id").Count() > 0) { (provider as Facebook).Public_Profile.id = value.GetNamedString("id"); ViewModel.ID = value.GetNamedString("id"); } if (value.Keys.Where(k => k == "last_name").Count() > 0) { (provider as Facebook).Public_Profile.last_name = value.GetNamedString("last_name"); ViewModel.LastName = value.GetNamedString("last_name"); } if (value.Keys.Where(k => k == "link").Count() > 0) { (provider as Facebook).Public_Profile.link = value.GetNamedString("link"); } if (value.Keys.Where(k => k == "locale").Count() > 0) { (provider as Facebook).Public_Profile.locale = value.GetNamedString("locale"); } if (value.Keys.Where(k => k == "name").Count() > 0) { (provider as Facebook).Public_Profile.name = value.GetNamedString("name"); if (string.IsNullOrEmpty((provider as Facebook).Public_Profile.first_name)) { if (value.GetNamedString("name").Split(' ').Count() == 1) { (provider as Facebook).Public_Profile.first_name = value.GetNamedString("name"); ViewModel.FirstName = value.GetNamedString("name"); } if (value.GetNamedString("name").Split(' ').Count() == 2) { (provider as Facebook).Public_Profile.first_name = value.GetNamedString("name").Split(' ')[0]; ViewModel.FirstName = value.GetNamedString("name").Split(' ')[0]; if (string.IsNullOrEmpty((provider as Facebook).Public_Profile.last_name)) { (provider as Facebook).Public_Profile.last_name = value.GetNamedString("name").Split(' ')[1]; ViewModel.LastName = value.GetNamedString("name").Split(' ')[1]; } } } } if (value.Keys.Where(k => k == "picture").Count() > 0) { (provider as Facebook).Public_Profile.picture = value.GetNamedString("picture"); } if (value.Keys.Where(k => k == "timezone").Count() > 0) { (provider as Facebook).Public_Profile.timezone = value.GetNamedString("timezone"); } if (value.Keys.Where(k => k == "updated_time").Count() > 0) { (provider as Facebook).Public_Profile.updated_time = value.GetNamedString("updated_time"); } if (value.Keys.Where(k => k == "verified").Count() > 0) { (provider as Facebook).Public_Profile.verified = value.GetNamedString("verified"); } response = await httpClient.GetStringAsync(new Uri((provider as Facebook).UserRequestURL)); value = JsonValue.Parse(response).GetObject(); foreach (string k in value.Keys) { if (k == "email") { (provider as Facebook).FaceBookUserInfo.email = value.GetNamedString("email"); ViewModel.MailAddress = value.GetNamedString("email"); } if (k == "middle_name") { (provider as Facebook).FaceBookUserInfo.middle_name = value.GetNamedString("middle_name"); ViewModel.MiddleName = value.GetNamedString("middle_name"); } } ViewModel.PhoneNumber = ""; break; default: break; } } } }