skip to Main Content

I have an app that allows users to log in via facebook, once user enters their credentials – My api request saves the user onto the database and auto-generates a user token(This is unique to each user). In order to display user specific details once user logs in – the token needs to be referenced. I am trying to get this token to the PCL project but it returns null just for the token. When I tried passing another string like name, it passes the correct value. Any help will be much appreciated.Thanks

FacebookRender in droid:

 public class FacebookRender : PageRenderer
    {
        public FacebookRender()
        {
            CustomerService customerService = new CustomerService();
            String error;
            var activity = this.Context as Activity;

            var auth = new OAuth2Authenticator(
                clientId: "",
                scope: "",
                authorizeUrl: new Uri("https://www.facebook.com/dialog/oauth/"),
                redirectUrl: new Uri("https://www.facebook.com/connect/login_success.html")
                );

            auth.Completed += async (sender, eventArgs) =>
                {
                    try
                    {
                        if (eventArgs.IsAuthenticated)
                        {
                            await AccountStore.Create().SaveAsync(eventArgs.Account, "FacebookProviderKey");

                            var accessToken = eventArgs.Account.Properties["access_token"].ToString();
                            var expiresIn = Convert.ToDouble(eventArgs.Account.Properties["expires_in"]);
                            var expiryDate = DateTime.Now + TimeSpan.FromSeconds(expiresIn);

                            var request = new OAuth2Request("GET", new Uri("https://graph.facebook.com/me?fields=email,first_name,last_name,gender,picture"), null, eventArgs.Account);
                            var response = await request.GetResponseAsync();
                            var obj = JObject.Parse(response.GetResponseText());

                            var id = obj["id"].ToString().Replace(""", "");
                            var name = obj["first_name"].ToString().Replace(""", "");
                            var surname = obj["last_name"].ToString().Replace(""", "");
                            var gender = obj["gender"].ToString().Replace(""", "");
                            //var email = obj["email"].ToString().Replace(""", "");

                            Customer.Customers cust = new Customer.Customers();
                            cust.Credentials = new Customer.Credentials();
                            cust.Name = name;
                            cust.Surname = surname;
                            cust.Email = "";
                            cust.MobilePhone = "";
                            cust.DOB = DateTime.Now;
                            cust.Number = "";
                            cust.City = "";
                            cust.Region = "";
                            cust.Country = "";
                            cust.DeviceToken = "sample";
                            cust.Credentials.SecretKey = "";

                            await customerService.AddCustomer(cust);

                            App.SaveToken(cust.Credentials.Token); - **//This is where I am passing the token**

                            App.NavigateToProfile(string.Format(name + surname));


                        }
                        else
                        {
                            App.NavigateToProfile("Invalid Login");
                        }
                    }
                    catch(Exception ex)
                    {
                        error = ex.Message;
                    }
                };
            activity.StartActivity(auth.GetUI(activity));
        }

App.cs

 public App()

 {
        InitializeComponent();


        MainPage = new NavigationPage(new MainPage());
    }
    public static void NavigateToProfile(string message)
    {
        App.Current.MainPage = (new Profile(message));
    }

    static string _Token;
    public static string Token
    {
        get { return _Token; }
    }

    public static void SaveToken(string token)
    {
        _Token = token;
    }

AboutPage.cs – I am passing the token in a label just to see if it’s passing

public partial class About : ContentPage
    {
        private Label _lbltoken;
        public About()
        {
            //InitializeComponent();
            Appearing += (object s, EventArgs a) => {
                _lbltoken.Text = App.Token;
            };

            string tk = App.Token;

            _lbltoken = new Label()
            {
                FontSize = 20,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                Text = tk,
            };
            var stack = new StackLayout
            {
                VerticalOptions = LayoutOptions.StartAndExpand,
                Children = { _lbltoken },
            };
            Content = stack;

        }


    }

2

Answers


  1. You can use the MessagingCenter.
    Messages may be sent as a result like a button click, a system event or some other incident. Subscribers might be listening in order to change the appearance of the user interface, save data or trigger some other operation.

    More Info

    Login or Signup to reply.
  2. I don’t really now if its good idea use static fields in App class. Xamarin access all fields with service locator, App.Current.[property] I will suggest you try to change these fields to public

    string _Token;
    public string Token
    {
      get { return _Token; }
    }
    
    public void SaveToken(string token)
    {
      _Token = token;
    }
    

    and use it with App.Current.SaveToken(token) or App.Current.Token

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search