Google API OAuth 2: используйте код авторизации в виде строки с библиотеками Google .NET.

Моему приложению 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.


person gosr    schedule 16.02.2013    source источник


Ответы (1)


Взгляните на Класс AuthorizationMgr и, в частности, метод RequestNativeAuthorization. Он использует LoopbackServerAuthorizationFlow, который создал для вас прослушиватель tcp и получил код из входящего запроса.

Вам также следует взглянуть на один из примеров, использующих этот механизм (например, CreateTask)

person peleyal    schedule 09.03.2013