В настоящее время я пишу приложение .NET WPF, которое использует API-интерфейсы Google Docs и Calendar. Я планирую интегрировать некоторые из новых API, таких как Tasks, на более позднем этапе, поэтому я хочу начать использовать OAuth 2.0 уже сейчас в процессе подготовки. Мне удалось получить и сохранить как токен обновления, так и токен доступа, и я реализовал некоторую логику для получения дополнительных токенов доступа по истечении срока действия текущих. Однако у меня возникли проблемы с загрузкой документа в документы Google. Похоже, что клиентские библиотеки GData изначально не поддерживают OAuth 2.0, и я не хочу переходить на более новые клиентские библиотеки (например, для задач), потому что на данном этапе мне не нужна зависимость от DotNetOpenAuth. Вместо этого я реализовал свой собственный OAuth2Authenticator, который добавляет необходимый заголовок OAuth 2, и я использую его с GData ResumableUploader. Когда я пытаюсь отправить запрос на загрузку документа с помощью ResumableUploader, я получаю ответ 401 Unauthorized с сообщением Token Invalid - Invalid AuthSub token.
Я звоню так:
ResumableUploader ru = new ResumableUploader(512);
Document entry = new Document();
entry.Title = documentName;
entry.MediaSource = new MediaFileSource(localDocumentPath, "application/pdf");
entry.Type = Document.DocumentType.PDF;
Uri createUploadUrl = new Uri("https://docs.google.com/feeds/upload/create-session/default/private/full");
AtomLink link = new AtomLink(createUploadUrl.AbsoluteUri);
link.Rel = ResumableUploader.CreateMediaRelation;
entry.DocumentEntry.Links.Add(link);
ru.Insert(new OAuth2Authenticator("MyApplicationName", "MyAccessToken"), entry.DocumentEntry);
Что приводит к этому запросу (от Fiddler):
POST https://docs.google.com/feeds/upload/create-session/default/private/full
HTTP/1.1 Authorization: OAuth sOmeTThing+SomThNig+etc==
Slug: DOC_0108.pdf
X-Upload-Content-Type: application/pdf
X-Upload-Content-Length: 175268
GData-Version: 3.0
Host: docs.google.com
Content-Type: application/atom+xml; charset=UTF-8
Content-Length: 508 Connection: Keep-Alive
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:gd="http://schemas.google.com/g/2005"
xmlns:docs="http://schemas.google.com/docs/2007">
<title type="text">DOC_0108.pdf</title>
<link href="https://docs.google.com/feeds/upload/create-session/default/private/full"
rel="http://schemas.google.com/g/2005#resumable-create-media" />
<category term="http://schemas.google.com/docs/2007#pdf"
scheme="http://schemas.google.com/g/2005#kind" label="pdf" />
</entry>
И соответствующий ответ 401:
HTTP/1.1 401 Unauthorized
Server: HTTP Upload Server Built on Sep 27 2011 04:44:57 (1317123897)
WWW-Authenticate: AuthSub realm="http://www.google.com/accounts/AuthSubRequest"
Content-Type: text/html; charset=UTF-8
Content-Length: 38
Date: Thu, 13 Oct 2011 08:45:11 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Token invalid - Invalid AuthSub token.
Я пробовал как «Авторизация: OAuth», так и «Авторизация: носитель» в заголовках, поскольку документация по API и OAuth 2.0 кажется разделенной, и я также пытался добавить токен в виде строки запроса (?access_token= и ?oauth_token =), но все эти вещи дают один и тот же ответ.
Я изучил все вопросы по API Google и OAuth, сообщения в блогах, документацию, которую смог найти, и испробовал множество способов выполнения этого вызова (несколько реализаций с API-интерфейсами .NET GData, пакет NuGet клиента REST, моя собственная реализация клиента REST, д.), и я не могу пройти мимо этой проблемы.
Любая помощь будет принята с благодарностью.