Почему Xamarin.Auth выдает ошибку аутентификации с помощью OAuth1Authenticator и Twitter

В настоящее время я использую Xamarin.Auth в проекте iOS для обработки аутентификации пользователей через Facebook и Twitter в моем приложении. Аутентификация Facebook с использованием OAuth2Authenticator отлично работает, и моя реализация основывалась главным образом на документации (http://components.xamarin.com/gettingstarted/xamarin.auth). Однако Twitter по-прежнему использует OAuth1, и поэтому я основывал свою реализацию в основном на ответах на эти вопросы StackOverflow (https://stackoverflow.com/a/21982205). Все работает правильно, и я могу получить пользователя, твиты и т. д., но после выполнения всего кода я получаю всплывающее окно «Ошибка аутентификации» на экране с сообщением «Ссылка на объект не установлена ​​​​на экземпляр объекта». однако на консоль ничего не выводится, как и в случае с большинством обычных ошибок, которые я видел до сих пор. Я могу закрыть всплывающее окно, и все по-прежнему работает правильно. Я считаю, что сузил проблему до чего-то в запросе OAuth1Authenticator, поскольку я все еще получаю сообщение об ошибке, когда весь остальной код обработки закомментирован. Пожалуйста, обратитесь к приведенному ниже коду, чтобы увидеть, что может быть причиной этого.

public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        signupBtn.TouchUpInside += delegate {
            LoginToTwitter(true, this);
        };
    }
    void LoginToTwitter(bool allowCancel, UIViewController _vc)
    {

        var auth = new OAuth1Authenticator (
            consumerKey: "My Consumer Key", 
            consumerSecret: "My Consumer Secret", 
            requestTokenUrl: new Uri("https://api.twitter.com/oauth/request_token"), 
            authorizeUrl: new Uri("https://api.twitter.com/oauth/authorize"), 
            accessTokenUrl: new Uri("https://api.twitter.com/oauth/access_token"), 
            callbackUrl: new Uri("My callback url"),
            getUsernameAsync: (IDictionary<string, string> accountProperties) => {
                string screen_name = "";
                if (accountProperties.TryGetValue("screen_name", out screen_name)) {
                    Console.WriteLine("SN: {0}", screen_name);
                    Account a = new Account(screen_name, accountProperties);
                    AuthenticatorCompletedEventArgs e = new AuthenticatorCompletedEventArgs(a);
                    TwitterCompleted(e, _vc);
                }
                return null;}
        );
        auth.AllowCancel = allowCancel;

        UIViewController authView = auth.GetUI ();

        _vc.PresentViewController (authView, true, null);
    }
    void TwitterCompleted (AuthenticatorCompletedEventArgs e, UIViewController _vc)
    {
        var theAccount = e.Account;
        var theProperties = theAccount.Properties;
        foreach (var item in theProperties) {
            Console.WriteLine (item); //debugging
        }
        InvokeOnMainThread (delegate {
            _vc.DismissViewController (true, null);
        });

        AccountStore.Create ().Save (e.Account, "Twitter");

        if (!e.IsAuthenticated) {
            Console.WriteLine("Not authorized");
            return;
        }

        theScreenName = e.Account.Properties["screen_name"];
        theCount = "2";

        IDictionary<string, string> theDict = new Dictionary<string, string>();;
        theDict.Add("screen_name", theScreenName);
        theDict.Add("count", theCount);


        var request = new OAuth1Request("GET", new Uri("https://api.twitter.com/1.1/statuses/user_timeline.json"), theDict, e.Account, false); 
        request.GetResponseAsync().ContinueWith (t => {
            if (t.IsFaulted)
                Console.WriteLine("Error: {0}", t.Exception.InnerException.Message);
            else if (t.IsCanceled)
                Console.WriteLine("Canceled");
            else
            {
                var obj = JsonValue.Parse (t.Result.GetResponseText());
                Console.WriteLine("object: {0}", obj); // debugging
            }

        }, uiScheduler);
        return;
    }
    private readonly TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

person user3509501    schedule 08.04.2014    source источник


Ответы (1)


вместо возврата null в "getUsernameAsync" верните задачу

person Prashant Kurlekar    schedule 07.12.2014
comment
Пожалуйста, поясните свой ответ подробнее! Итак, ОП понимает, в чем была проблема и как работает решение. - person Rizier123; 07.12.2014