从 Mac 登录 Microsoft Graph API (Xamarin)

Login to Microsoft Graph API from Mac (Xamarin)

我正在尝试将我的 Mac 应用程序(用 c# / Visual Studio 为 Mac 编写)连接到 Microsoft 的 Graph API。

在 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 上使用相同的方法会导致 "not implemented" 异常。

我尝试了几种方法,例如来自 SimpleAuth 的 ADFSApi 和 MicrosoftLiveConnectApi,但没有成功。

有人知道如何执行此身份验证吗?另一方面,我经常发现使用浏览器的指南...如何使用代码从 App 读取浏览器的响应以获取令牌?

------------更新--------------------

经过几个小时的工作,我实施了另一种流程。基本上当按下登录按钮时,我执行一个 Segue 到一个只有 WebView 的 Window。

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);
    }

登录结束后,系统在info.plist

中提示"There is no App to open MSAL[MYID] etc. So I add the "bind”

实际上 URL 方案是 MSAL[MYID]。

我在 AppDelegate.cs

中实现了 OpenUrls 方法
 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 授权以确保我的应用程序秘密安全?

我不知道您的具体情况。但是你可以使用 WebKit.WebView

在我的例子中,我通过我自己的网站使用 facebook 登录,并通过重定向 url.

传回 facebook 令牌

分配 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 或加载的页面

中提取所需数据

//更新

如果不是通过您自己的服务器登录。为 https://127.0.0.1(或任何真正的东西)设置重定向 url 并使用其中之一拦截重定向(检查正确的 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;
        };