async public void LoginWithBehavior(string permissions, FacebookLoginBehavior behavior) { switch (behavior) { case FacebookLoginBehavior.LoginBehaviorMobileInternetExplorerOnly: { #if (WP8 || WINDOWS_PHONE) String appId = await AppAuthenticationHelper.GetFacebookConfigValue("Facebook", "AppId"); Uri uri = new Uri( String.Format( "https://m.facebook.com/v2.1/dialog/oauth?redirect_uri={0}%3A%2F%2Fauthorize&display=touch&state=%7B%220is_active_session%22%3A1%2C%22is_open_session%22%3A1%2C%22com.facebook.sdk_client_state%22%3A1%2C%223_method%22%3A%22browser_auth%22%7D&scope={2}&type=user_agent&client_id={1}&sdk=ios", String.Format("fb{0}", appId), appId, permissions), UriKind.Absolute); Launcher.LaunchUriAsync(uri); break; #else throw new NotImplementedException("Internet explorer based login is not available on Windows"); #endif } case FacebookLoginBehavior.LoginBehaviorWebViewOnly: { String appId = await AppAuthenticationHelper.GetFacebookConfigValue("Facebook", "AppId"); #if WP8 || WINDOWS_PHONE Uri uri = new Uri( String.Format( "https://m.facebook.com/v2.1/dialog/oauth?redirect_uri={0}%3A%2F%2Fauthorize&display=touch&state=%7B%220is_active_session%22%3A1%2C%22is_open_session%22%3A1%2C%22com.facebook.sdk_client_state%22%3A1%2C%223_method%22%3A%22browser_auth%22%7D&scope={2}&type=user_agent&client_id={1}&sdk=ios", String.Format("fb{0}", appId), appId, permissions), UriKind.Absolute); #else Uri uri = await GetLoginUrl(permissions); #endif WebviewAuthentication.AuthenticateAsync(WebAuthenticationOptions.None, uri, null); break; } case FacebookLoginBehavior.LoginBehaviorWebAuthenticationBroker: #if WINDOWS { try { // TODO: What to do here? LoginAsync returns inproc. Login with IE returns out of proc? var result = await LoginAsync(permissions, FacebookLoginBehavior.LoginBehaviorWebAuthenticationBroker); // when the results are available, launch the event handler if (OnFacebookAuthenticationFinished != null) { OnFacebookAuthenticationFinished(result); } if (OnSessionStateChanged != null) { OnSessionStateChanged(LoginStatus.LoggedIn); } } catch (FacebookOAuthException e) { if (OnSessionStateChanged != null) { OnSessionStateChanged(LoginStatus.LoggedOut); } } break; } #else { throw new NotImplementedException("WebviewAuthentication is not implemented on Windows Phone"); } #endif// WINDOWS case FacebookLoginBehavior.LoginBehaviorApplicationOnly: { #if WP8 || WINDOWS_PHONE LoginWithApp(permissions); break; #else throw new NotImplementedException("Login via app is not available on Windows"); #endif } } }
private async Task <FacebookOAuthResult> PromptOAuthDialog(string permissions, WebAuthenticationOptions options, FacebookLoginBehavior loginBehavior) { #if !WINDOWS if (loginBehavior != FacebookLoginBehavior.LoginBehaviorWebViewOnly) { throw new NotImplementedException("Following login behavior is not supported on Windows Phone: " + loginBehavior.ToString()); } #endif // Use WebviewAuthentication to launch server side OAuth flow Uri startUri = await this.GetLoginUrl(permissions); Uri endUri = new Uri("https://www.facebook.com/connect/login_success.html"); WebAuthenticationResult result = null; #if WINDOWS if (loginBehavior == FacebookLoginBehavior.LoginBehaviorWebAuthenticationBroker) { result = await WebAuthenticationBroker.AuthenticateAsync(options, startUri, endUri); if (result.ResponseStatus == WebAuthenticationStatus.ErrorHttp) { throw new HttpRequestException("An Http error happened. Error Code: " + result.ResponseStatus.ToString()); } else if (result.ResponseStatus == WebAuthenticationStatus.UserCancel) { throw new FacebookOAuthException("Facebook.Client: User cancelled login in WebAuthBroker"); } } #endif var client = new FacebookClient(); var authResult = client.ParseOAuthCallbackUrl(new Uri(result.ResponseData)); return(authResult); }
internal async Task <AccessTokenData> LoginAsync(string permissions, FacebookLoginBehavior loginBehavior) { return(await LoginAsync(permissions, false, loginBehavior)); }
internal async Task <AccessTokenData> LoginAsync(string permissions, bool force, FacebookLoginBehavior loginBehavior) { if (this.LoginInProgress) { throw new InvalidOperationException("Login in progress."); } this.LoginInProgress = true; try { var session = AccessTokenDataCacheProvider.Current.GetSessionData(); if (session == null) { #if WINDOWS // Authenticate var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #else var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #endif FacebookClient client = new FacebookClient(authResult.AccessToken); var parameters = new Dictionary <string, object>(); parameters["fields"] = "id"; var result = await client.GetTaskAsync("me", parameters); var dict = (IDictionary <string, object>)result; session = new AccessTokenData { AccessToken = authResult.AccessToken, Expires = authResult.Expires, FacebookId = (string)dict["id"], }; } else { // Check if we are requesting new permissions bool newPermissions = false; if (!string.IsNullOrEmpty(permissions)) { var p = permissions.Split(','); newPermissions = session.CurrentPermissions.Join(p, s1 => s1, s2 => s2, (s1, s2) => s1).Count() != p.Length; } // Prompt OAuth dialog if force renew is true or // if new permissions are requested or // if the access token is expired. if (force || newPermissions || session.Expires <= DateTime.UtcNow) { #if WINDOWS // Authenticate var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #else var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #endif if (authResult != null) { session.AccessToken = authResult.AccessToken; session.Expires = authResult.Expires; } } } // Set the current known permissions if (!string.IsNullOrEmpty(permissions)) { var p = permissions.Split(','); session.CurrentPermissions = session.CurrentPermissions.Union(p).ToList(); } // Save session data AccessTokenDataCacheProvider.Current.SaveSessionData(session); CurrentAccessTokenData = session; } finally { this.LoginInProgress = false; } return(CurrentAccessTokenData); }
new PropertyMetadata(FacebookLoginBehavior.LoginBehaviorMobileInternetExplorerOnly));
internal async Task <AccessTokenData> LoginAsync(FacebookLoginBehavior loginBehavior) { return(await LoginAsync(null, false, loginBehavior)); }
private async Task<FacebookOAuthResult> PromptOAuthDialog(string permissions, WebAuthenticationOptions options, FacebookLoginBehavior loginBehavior) { #if !WINDOWS if (loginBehavior != FacebookLoginBehavior.LoginBehaviorWebViewOnly) { throw new NotImplementedException("Following login behavior is not supported on Windows Phone: " + loginBehavior.ToString()); } #endif // Use WebviewAuthentication to launch server side OAuth flow Uri startUri = await this.GetLoginUrl(permissions); Uri endUri = new Uri("https://www.facebook.com/connect/login_success.html"); WebAuthenticationResult result = null; #if WINDOWS if (loginBehavior == FacebookLoginBehavior.LoginBehaviorWebAuthenticationBroker) { result = await WebAuthenticationBroker.AuthenticateAsync(options, startUri, endUri); if (result.ResponseStatus == WebAuthenticationStatus.ErrorHttp) { throw new HttpRequestException("An Http error happened. Error Code: " + result.ResponseStatus.ToString()); } else if (result.ResponseStatus == WebAuthenticationStatus.UserCancel) { throw new FacebookOAuthException("Facebook.Client: User cancelled login in WebAuthBroker"); } } #endif var client = new FacebookClient(); var authResult = client.ParseOAuthCallbackUrl(new Uri(result.ResponseData)); return authResult; }
async public void LoginWithBehavior(string permissions, FacebookLoginBehavior behavior) { switch (behavior) { case FacebookLoginBehavior.LoginBehaviorMobileInternetExplorerOnly: { #if (WP8 || WINDOWS_PHONE) String appId = Session.AppId; Uri uri = new Uri( String.Format( "https://m.facebook.com/v2.1/dialog/oauth?redirect_uri={0}&display=touch&state=%7B%220is_active_session%22%3A1%2C%22is_open_session%22%3A1%2C%22com.facebook.sdk_client_state%22%3A1%2C%223_method%22%3A%22browser_auth%22%7D&scope={2}&type=user_agent&client_id={1}&sdk=ios", LoginRedirectUri, appId, permissions), UriKind.Absolute); Launcher.LaunchUriAsync(uri); break; #else throw new NotImplementedException("Internet explorer based login is not available on Windows"); #endif } case FacebookLoginBehavior.LoginBehaviorWebViewOnly: { String appId = Session.AppId; #if WP8 || WINDOWS_PHONE Uri uri = new Uri( String.Format( "https://m.facebook.com/v2.1/dialog/oauth?redirect_uri={0}%3A%2F%2Fauthorize&display=touch&state=%7B%220is_active_session%22%3A1%2C%22is_open_session%22%3A1%2C%22com.facebook.sdk_client_state%22%3A1%2C%223_method%22%3A%22browser_auth%22%7D&scope={2}&type=user_agent&client_id={1}&sdk=ios", String.Format("fb{0}", appId), appId, permissions), UriKind.Absolute); #else Uri uri = await GetLoginUrl(permissions); #endif WebviewAuthentication.AuthenticateAsync(WebAuthenticationOptions.None, uri, null); break; } case FacebookLoginBehavior.LoginBehaviorWebAuthenticationBroker: #if WINDOWS { try { // TODO: What to do here? LoginAsync returns inproc. Login with IE returns out of proc? var result = await LoginAsync(permissions, FacebookLoginBehavior.LoginBehaviorWebAuthenticationBroker); // when the results are available, launch the event handler if (OnFacebookAuthenticationFinished != null) { OnFacebookAuthenticationFinished(result); } if (OnSessionStateChanged != null) { OnSessionStateChanged(LoginStatus.LoggedIn); } } catch (FacebookOAuthException e) { if (OnSessionStateChanged != null) { OnSessionStateChanged(LoginStatus.LoggedOut); } } break; } #else { throw new NotImplementedException("WebviewAuthentication is not implemented on Windows Phone"); } #endif// WINDOWS case FacebookLoginBehavior.LoginBehaviorApplicationOnly: { #if WP8 || WINDOWS_PHONE LoginWithApp(permissions); break; #else throw new NotImplementedException("Login via app is not available on Windows"); #endif } } }
internal async Task<AccessTokenData> LoginAsync(string permissions, bool force, FacebookLoginBehavior loginBehavior) { if (this.LoginInProgress) { throw new InvalidOperationException("Login in progress."); } this.LoginInProgress = true; try { var session = AccessTokenDataCacheProvider.Current.GetSessionData(); if (session == null) { #if WINDOWS // Authenticate var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #else var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #endif FacebookClient client = new FacebookClient(authResult.AccessToken); var parameters = new Dictionary<string, object>(); parameters["fields"] = "id"; var result = await client.GetTaskAsync("me", parameters); var dict = (IDictionary<string, object>)result; session = new AccessTokenData { AccessToken = authResult.AccessToken, Expires = authResult.Expires, FacebookId = (string)dict["id"], }; } else { // Check if we are requesting new permissions bool newPermissions = false; if (!string.IsNullOrEmpty(permissions)) { var p = permissions.Split(','); newPermissions = session.CurrentPermissions.Join(p, s1 => s1, s2 => s2, (s1, s2) => s1).Count() != p.Length; } // Prompt OAuth dialog if force renew is true or // if new permissions are requested or // if the access token is expired. if (force || newPermissions || session.Expires <= DateTime.UtcNow) { #if WINDOWS // Authenticate var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #else var authResult = await PromptOAuthDialog(permissions, WebAuthenticationOptions.None, loginBehavior); #endif if (authResult != null) { session.AccessToken = authResult.AccessToken; session.Expires = authResult.Expires; } } } // Set the current known permissions if (!string.IsNullOrEmpty(permissions)) { var p = permissions.Split(','); session.CurrentPermissions = session.CurrentPermissions.Union(p).ToList(); } // Save session data AccessTokenDataCacheProvider.Current.SaveSessionData(session); CurrentAccessTokenData = session; } finally { this.LoginInProgress = false; } return CurrentAccessTokenData; }
internal async Task<AccessTokenData> LoginAsync(string permissions, FacebookLoginBehavior loginBehavior) { return await LoginAsync(permissions, false, loginBehavior); }
internal async Task<AccessTokenData> LoginAsync(FacebookLoginBehavior loginBehavior) { return await LoginAsync(null, false, loginBehavior); }