Вход в Microsoft Graph API с Mac (Xamarin)

Я пытаюсь подключить свое приложение для Mac (написанное на С#/Visual Studio для Mac) к Graph API от Microsoft.

В Windows я могу использовать ADAL и выполнять такие операции, как:

        PublicClientApplication myApp = new PublicClientApplication(MYID);
        string Scope = "User.ReadBasic.All User.Read";
        var result = await myApp.AcquireTokenAsync(Scope.Split(' '));
        return result.AccessToken;

В то время как тот же подход на Mac приводит к исключению «не реализовано».

Я пробовал несколько способов, таких как ADFSApi и MicrosoftLiveConnectApi от SimpleAuth, но безуспешно.

Кто-нибудь знает, как выполнить эту аутентификацию? С другой стороны, я очень часто нахожу руководства, использующие браузер... Как я могу прочитать ответ браузера от приложения с кодом для получения токена?

------------- ОБНОВИТЬ ---------------------

После нескольких часов работы я реализовал альтернативный поток. В основном, когда нажата кнопка входа, я выполняю переход к окну только с WebView.

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

        var webView = new WebKit.WebView(this.MainView.Frame, "officeWebView", "noName");

        webView.MainFrameUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?state=ltxzlgtghhxgpwuh&client_id=[MYID]&response_type=code&scope=User.ReadBasic.All%20User.Read&redirect_uri=msal[MYID]://auth";
        webView.FinishedLoad += (sender2, e) =>
        {
            var url = ((WebKit.WebView)sender2).MainFrameUrl;
        };

        this.MainView.AddSubview(webView);
    }

В конце входа в систему система выдает мне сообщение типа «Нет приложения для открытия MSAL [MYID] и т. Д. Поэтому я добавляю« привязку »в info.plist

введите здесь описание изображения

Где на самом деле схема URL-адреса — MSAL[MYID].

Я реализовал метод OpenUrls в AppDelegate.cs.

 public override void OpenUrls(NSApplication application, NSUrl[] urls)
    {
        Console.WriteLine("TEST!!!");
        foreach(var url in urls)
            Console.WriteLine(url);

        base.OpenUrls(application, urls);
    }

Но кажется, что OpenUrls НИКОГДА не запускается (никогда не печатал ни одной строки, никогда не попадал в точку останова).

Что случилось? И, если я успешно сделал это таким образом, как я могу перейти на грант IMPLICIT, чтобы сохранить секрет моего приложения в безопасности?


person Ziba Leah    schedule 25.01.2018    source источник


Ответы (1)


Я не знаю точных деталей вашей ситуации. Но вы можете использовать WebKit.WebView

В моем случае я использую вход в facebook через свой собственный веб-сайт и передаю токен facebook обратно через URL-адрес перенаправления.

Назначить FrameLoadDelegate

webView.FrameLoadDelegate = this;
webView.MainFrameUrl = starturlhere;

Реализовать webView:didFinishLoadForFrame:

    [Export ("webView:didFinishLoadForFrame:")]
    public void FinishedLoad (WebKit.WebView sender, WebKit.WebFrame forFrame)
    {
        // page loaded
        System.Diagnostics.Debug.WriteLine("FinishedLoad: "+sender.MainFrameUrl);

        var url = new NSUrl(sender.MainFrameUrl);
        var document = sender.MainFrameDocument;

        // check if this is the login result 
        // if not do nothing and return (login flow not done)
    }

Извлеките необходимые данные либо из URL-адреса, либо из загруженной страницы.

// ОБНОВИТЬ

ЕСЛИ не входите через свой собственный сервер. Установите URL-адрес перенаправления для https://127.0.0.1 (или что-то еще) и перехватите перенаправление с помощью одного из этих ( проверьте правильность URL):

        webView.ReceivedServerRedirectForProvisionalLoad += (object sender, WebFrameEventArgs e) => 
        {
            //e.ForFrame.ProvisionalDataSource.Request.Url;
        };

        webView.OnSendRequest += (WebView sender, NSObject identifier, NSUrlRequest request, NSUrlResponse redirectResponse, WebDataSource dataSource) => 
        {
            //request.Url;
        };
person svn    schedule 25.01.2018
comment
Я пытаюсь сделать так, и почти работает. Но в последней части входа в систему я начинаю получать эту ошибку: Ошибка HTTP-загрузки NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9800). Я уже добавил в info.plist все флаги, разрешающие небезопасное соединение, но, похоже, это не работает. - person Ziba Leah; 26.01.2018
comment
разрешить небезопасное соединение при входе в систему? Но без подробностей трудно сказать. На kCFStreamErrorDomainSSL есть много сообщений, но это другой вопрос. - person svn; 26.01.2018
comment
я решил ошибку, добавив REDIRECT_URI к вызову аутентификации OAuth. Теперь система должна вызвать мой метод OpenUrls, но он не срабатывает. Я добавляю материал к вопросу, чтобы его было легче понять - person Ziba Leah; 26.01.2018
comment
Возможно, вы можете перенаправить на локальный хост 127.0.0.1 и захватить URL-адрес из веб-просмотра. Тогда OpenUrls не нужен. - person svn; 26.01.2018
comment
redirect_uri должен быть SSL, поэтому, если я поставлю https://localhost, я снова получу старую ошибку: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9800) - person Ziba Leah; 26.01.2018
comment
работал как шарм! Благодарю вас! P.S.: Я попытался создать совершенно новый проект, и материалы info.plist и т. д. сработали. Так что это должно быть связано с другим плагином или предыдущей конфигурацией приложения. - person Ziba Leah; 26.01.2018