コード例 #1
0
        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
            }
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 internal async Task <AccessTokenData> LoginAsync(string permissions, FacebookLoginBehavior loginBehavior)
 {
     return(await LoginAsync(permissions, false, loginBehavior));
 }
コード例 #4
0
        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);
        }
コード例 #5
0
 new PropertyMetadata(FacebookLoginBehavior.LoginBehaviorMobileInternetExplorerOnly));
コード例 #6
0
 internal async Task <AccessTokenData> LoginAsync(FacebookLoginBehavior loginBehavior)
 {
     return(await LoginAsync(null, false, loginBehavior));
 }
コード例 #7
0
        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;
        }
コード例 #8
0
        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
                }
            }
        }
コード例 #9
0
        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;
        }
コード例 #10
0
 internal async Task<AccessTokenData> LoginAsync(string permissions, FacebookLoginBehavior loginBehavior)
 {
     return await LoginAsync(permissions, false, loginBehavior);
 }
コード例 #11
0
 internal async Task<AccessTokenData> LoginAsync(FacebookLoginBehavior loginBehavior)
 {
     return await LoginAsync(null, false, loginBehavior);
 }