我的WinForms应用需要访问其中一个Google API(日历)。为此,该应用需要获得授权,Google已为此目的提供了OAuth 2。我已经阅读了他们的文档网站here上的所有内容。
在Google上的另一个文档页面中,我学习了如何通过浏览器请求获取授权密钥。这发生在Console 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帐户的权限,然后我得到一个代码作为回报。这段代码我粘贴回控制台窗口,应用程序的其余部分按预期工作(在我的例子中,创建一个新的Calendar事件)。
但我的问题是我想在WinForms应用程序中使用此功能,而不是Console应用程序。我不能够在Google的网页上找到有关此内容的任何内容。
到目前为止我所拥有的:
我觉得使用Google的REST客户端而不是原生的.NET库是可能的,但我真的想使用.NET库而不是REST。
答案 0 :(得分:0)
查看AuthorizationMgr类,特别是RequestNativeAuthorization方法。它使用LoopbackServerAuthorizationFlow类,为您创建了一个tcp监听器,并从传入的请求中获取代码。
您还应该查看使用该机制的其中一个示例(例如CreateTask示例)