Моему приложению WinForms требуется доступ к одному из API Google (календарю). Для этого у приложения должна быть авторизация, и 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.