
рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рд╡рд┐рдВрдбреЛрдЬ рдПрдЬрд╝реНрдпреЛрд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ Google, рдлреЗрд╕рдмреБрдХ, рдЯреНрд╡рд┐рдЯрд░ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдЕрдХрд╛рдЙрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдмрд╛рд╣рд░реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рд╕реЗ рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХреАрдХреГрдд рддрд░реАрдХреЗ рд╣реИрдВред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рдЧрднрдЧ рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реИрдВ ... рдирд┐рдпрдорд┐рдд рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╕реНрдХрдЯреЙрдкред
рд╣рдо рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рд▓реЗрдЦрди рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ Windows.UI.Prups рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рддрд┐рдХрдбрд╝реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрд╕ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдЕрднреА рднреА рд╣рд╛рд╡реА рд╣реИ? рдЪрд▓реЛ рдареАрдХ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
- рдмрд╛рд╣рд░реА рдкреНрд░рджрд╛рддрд╛ рд╡реЗрдм рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рдЪрд╛рди рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдПрдХ рдпреВрдЬрд░ рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ - рдЬреЛ рдмреИрдХрдПрдВрдб рдХреЗ рдЖрдЧреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
- MobileServiceUser рд╡рд░реНрдЧ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ ID рд▓реМрдЯрд╛рдПрдВ, рдФрд░ MobileServiceClient рд╡рд░реНрдЧ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрдиред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рд╣реА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░реЗрдВрдЧреЗред
рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдФрд░ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ Microsoft рдЦрд╛рддреЗ рдореЗрдВ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди
рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ Microsoft рдкреНрд░рджрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ:
- рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде WPF рд╡рд┐рдВрдбреЛ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред
- рд▓реЙрдЧрд┐рди рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд▓реЙрдЧрд┐рди рдкреЗрдЬред
- рджреВрд╕рд░рд╛ рдкреЗрдЬ WebBrowser рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ - "WebLoginPage"ред
рдХреЛрдб рдореЗрдВ, рд╣рдо MobileServiceClient рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
public static class DesktopWebLoginExtension { public async Task<MobileServiceUser> LoginAsync(this MobileServiceClient client, MobileServiceAuthenticationProvider provider, LoginPape loginPage) { Uri startUri = new Uri(client.ApplicationUri, "login/" + provider.ToString().ToLowerInvariant()); Uri endUri = new Uri(client.ApplicationUri, "login/done"); LoginResult externalAuthProviderLoginResult = await loginPage.GetLoginResultAsync(startUri, endUri); if (externalAuthProviderLoginResult == null) { return null; } var returnServiceUser = new MobileServiceUser(externalAuthProviderLoginResult.UserId); returnServiceUser.MobileServiceAuthenticationToken = externalAuthProviderLoginResult.AuthenticationToken; client.CurrentUser = returnServiceUser; return returnServiceUser; } }
рдЖрдЗрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ:
- рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░рд╛ рддрд░реАрдХрд╛ рд▓реЙрдЧрд┐рдирдкреЗрдЬ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкрд░рдд рдХрд╛ рдПрдХ рд╕рдХрд▓ рдЙрд▓реНрд▓рдВрдШрди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред
- startUri рдФрд░ endUri рдХреЛ рдЗрд╕ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- loginPage.GetLoginResultAsync - рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдЬреЛ LoginResult рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реМрдЯрд╛рдПрдЧреА
- рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рднрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдФрд░ рдпрд╣рд╛рдБ рдХрдВрдЯреЗрдирд░ рдХреНрд▓рд╛рд╕ рд╣реА рд╣реИ, рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЖрдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
public class LoginResult { public string UserId { get; set; } public string AuthenticationToken { get; set; } }
WebLoginPage рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public class WebLoginPage : Page { private Uri startUri; private Uri endUri; public delegate void LoginCompleteEventHandler(LoginResult result); public event LoginCompleteEventHandler UserLogedIn; public LoginBrowserPage() { InitializeComponent(); webBrowser.Navigating += webBrowser_Navigating; } public Task<LoginResult> GetLoginResultAsync(Uri startUri, Uri endUri) { this.startUri = startUri; this.endUri = endUri; var returnTask = new TaskCompletionSource<LoginResult>(); webBrowser.Navigate(startUri); this.UserLogedIn += (r) => { returnTask.SetResult(r); }; return returnTask.Task; } internal void webBrowser_Navigating(object sender, NavigatingCancelEventArgs e) { if (e.Uri.Equals(this.endUri)) { string uri = e.Uri.ToString(); if (uri.LastIndexOf("#token=") != 0) { var startOfToken = uri.IndexOf("#token=") + "#token=".Length; uri = uri.Substring(startOfToken).Replace("%2C", ","); JObject jsonObj = JObject.Parse(uri); var userId = jsonObj["user"]["userId"].ToObject<string>(); var authToken = jsonObj["authenticationToken"].ToObject<string>(); UserLogedIn(new LoginResult() { UserId = userId, AuthenticationToken = authToken }); } else { UserLogedIn(null); } } } }
рдЖрдЗрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ:
- рд╣рдордиреЗ рдЙрд╕ рдШрдЯрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдорд┐рдиреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╣реЛрдЧреАред
- GetLoginResultAsync рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЕрджреНрднреБрдд TaskCompletionSource рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдкреНрд░рддреАрдХреНрд╖рд╛" рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ "рд╡реЗрдЯрд┐рдВрдЧ рд▓рд╛рдЗрди" рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИред рдПрдХ рдмрдбрд╝реЗ рдЦрд┐рдВрдЪрд╛рд╡ рдХреЗ рд╕рд╛рде, рдЗрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди (рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕рд▓реА) рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рдореЗрдВ рдПрдХ рд▓реЛрдбрд┐рдВрдЧ рдореЛрдбрд▓ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ Microsoft рд╣рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИред
- webBrowser_Navigating - рдЗрд╕ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдзреНрдпрд╛рди рд╕реЗ рд╕реЗрд╡рд╛ рд╕реЗ JSON рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рд╖реНрдард┐рдд UserId рдФрд░ AuthenticationToken рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдШрдЯрдирд╛ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ - рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред
рдЕрдм рдХреБрдЫ рднреА рд╣рдореЗрдВ рд╕рд╣реА рдЬрдЧрд╣ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ:
var user = await MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, webLoginPage);
PS рдЖрдЦрд┐рд░ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд╡реЗрдмрдмреНрд░реЙрд╕рд░ рд╣рдореЗрдВ JSON рд╕реЗрд╡рд╛ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред рдпрд╣ IE рдЗрдВрдЬрди рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЗрд╕ рдХреБрдВрдЬреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рд╡рд┐рдВрдбреЛрдЬ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕рдВрдкрд╛рджрдХ рд╕рдВрд╕реНрдХрд░рдг 5.00;
[HKEY_CLASSES_ROOT \ MIME \ Database \ Content рдкреНрд░рдХрд╛рд░ \ application / json]
"CLSID" = "{25336920-03F9-11cf-8FD0-00AA00686313}"
"рдПрдиреНрдХреЛрдбрд┐рдВрдЧ" = рд╣реЗрдХреНрд╕: 08,00,00,00
рдирд┐рд╖реНрдХрд░реНрд╖
рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ MobileService.LoginAsync рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдкреНрд░рд┐рдп рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рдВрджрд░реНрдн:
рд╡рд┐рдВрдбреЛрдЬ рдПрдЬрд╝реНрдпреЛрд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд░реЗрд╕реНрдЯ рдПрдкреАрдЖрдИ рд╕рдВрджрд░реНрднрдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░реЗрдВGoogle рдореЗрдВ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ