如果您想完全避免用户交互,并且仍要在控制台应用程序中使用 onedrive api,则必须实现自定义逻辑。
首先您需要将 Main 方法标记为 [STAThread](单线程单元模块):
[STAThread]
static void Main(string[] args)
{
//...
}
然后在运行时创建 WebBrowser 控件(您将需要 WinForms 参考)。
将 DocumentCompleted 事件添加到 WebBrowser,并在其中注入您的 JavaScript 以自动填写登录表单并模拟登录按钮单击,并在同一方法中检查 WebBrowser url 是否是您的 ReturnUrl。如果是则解析授权码,并继续获取访问和刷新令牌。
setInterval(function(){
//your code to interact with ui
}, 1000);
不要忘记放置一些代码拦截器,例如:
while (!_autoLoginCompleted)
{
Application.DoEvents();
Thread.Sleep(100);
}
使用适当的参数(clientId、returnUrl)导航到 https://login.microsoftonline.com/common/oauth2/authorize 以触发 DocumentCompleted 事件。
之后,您可以存储这些令牌并在以后使用它们,并定期刷新它们。
您可能还需要抑制 JS 异常。
顺便说一句,一件有趣的事情是他们的所有代码示例,如果您使用的是本机(控制台)应用程序,他们并没有说您不需要指定客户端密码。