0

我的 WinForms 应用程序需要访问 Google API(日历)之一。为此,该应用需要获得授权,Google 为此提供了 OAuth 2。我在这里阅读了他们文档网站上的所有内容。

从 Google 上的另一个文档页面,我了解了如何通过浏览器请求获取授权密钥。这发生在控制台 C# 应用程序中。它的作用是:

var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description, CLIENT_ID, CLIENT_SECRET);
var auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthorization);
var service = new CalendarService(auth);
string id = <calendar id>;
Calendar calendar = service.Calendars.Get(id).Fetch();

在最后一行,会打开一个浏览器窗口,其中包含一个 Google 页面,要求我允许该应用访问我的 Google 帐户。在控制台应用程序中,ReadLine() 正在等待输入。这来自GetAuthorization方法:

private static IAuthorizationState GetAuthorization(NativeApplicationClient arg)
{
    // Get the auth URL:
    IAuthorizationState state = new AuthorizationState(new[] { CalendarService.Scopes.Calendar.GetStringValue() });
    state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
    Uri authUri = arg.RequestUserAuthorization(state);

    // Request authorization from the user (by opening a browser window):
    Process.Start(authUri.ToString());
    Console.Write("  Authorization Code: ");
    string authCode = Console.ReadLine();
    Console.WriteLine();

    // Retrieve the access token by using the authorization code:
    return arg.ProcessUserAuthorization(authCode, state);
}

因此,我授予我的应用程序访问我的 Gmail 帐户的权限,并得到一个代码作为回报。我将此代码粘贴回控制台窗口,然后应用程序的其余部分按应有的方式工作(在我的情况下,创建一个新的日历事件)。

但我的问题是我希望在 WinForms 应用程序中使用此功能,而不是在控制台应用程序中。我无法在 Google 的页面上找到任何关于此的内容。

到目前为止我所拥有的:

  • 用户单击一个按钮,浏览器打开,用户授予访问权限并检索代码。
  • 用户将此代码粘贴到应用程序中。
  • 单击另一个按钮,这是我想使用用户输入的代码进行授权过程的地方。这是一个字符串,我不知道如何将它与本文顶部编写的所有身份验证方法结合起来。

我觉得使用 Google 的 REST 客户端而不是本地 .NET 库是可能的,但我真诚地想使用 .NET 库而不是 REST。

4

1 回答 1

0

查看AuthorizationMgr类,特别是 RequestNativeAuthorization 方法。它使用LoopbackServerAuthorizationFlow类,该类为您创建了一个 tcp 侦听器并从传入请求中获取代码。

您还应该查看使用该机制的示例之一(例如CreateTask示例)

于 2013-03-09T03:04:51.810 回答