DotNetOpenAuth с фидом Календаря Google - PullRequest
6 голосов
/ 02 октября 2010

Я несколько дней ломал голову, пытаясь получить список календарей от Google, используя DotNetOpenAuth.

Я могу успешно получить список контактов, используя образцы DotNetOpenAuth.Я интегрировал его с моим доменом, используя OpenId + OAuth.Все отлично работает, чтобы получить список контактов.

Так что оттуда я изменил код, чтобы попытаться получить список календарей, и я продолжаю получать 401 Несанкционированную ошибку.

Я знаю, что этоавторизация, потому что я могу получить список контактов.У кого-нибудь есть пример кода, как они получают календари или события календаря, используя DotNetOpenAuth с Google ???

Спасибо

Обновление:

Спасибодля ответа.Я прочитал все, что могу достать.Вот что я сделал до сих пор

Шаг 1: Я создал новую GetCalendarEndPoint в GoogleConsumer.cs

private static readonly MessageReceivingEndpoint GetCalendarEndpoint = new MessageReceivingEndpoint("https://www.google.com/calendar/feeds/default", HttpDeliveryMethods.GetRequest);

Шаг 2: Далее я создал новый метод GetCalendars, созданный по образцу после GetContactsМетод в GoogleConsumer.cs - (Восстановить dll и т. Д.)

    public static XDocument GetCalendars(ConsumerBase consumer, string accessToken, int maxResults/* = 25*/, int startIndex/* = 1*/) {
            if (consumer == null)
            {
                throw new ArgumentNullException("consumer");
            }

            var request = consumer.PrepareAuthorizedRequest(GetCalendarEndpoint, accessToken);
            var response = consumer.Channel.WebRequestHandler.GetResponse(request);
            string body = response.GetResponseReader().ReadToEnd();
            XDocument result = XDocument.Parse(body);
            return result;

Шаг 3: В своем приложении я изменил ScopeURI для URI календаря из GoogleConsumer следующим образом

private IAuthenticationRequest GetGoogleRequest()
{
    Realm realm = Request.Url.Scheme + Uri.SchemeDelimiter + Global.GoogleTokenManager.ConsumerKey + "/";
    IAuthenticationRequest authReq = relyingParty.CreateRequest(GoogleOPIdentifier, realm);

    // Prepare the OAuth extension
    string scope = GoogleConsumer.GetScopeUri(GoogleConsumer.Applications.Calendar);
    Global.GoogleWebConsumer.AttachAuthorizationRequest(authReq, scope);

    // We also want the user's email address
    var fetch = new FetchRequest();
    fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
    authReq.AddExtension(fetch);

    return authReq;
}

Однако, когда я запускаю приложение, я получаю 401 Unauthorized, когда я выполняю следующий вызов

 var calendars = GoogleConsumer.GetCalendars(Global.GoogleWebConsumer, State.GoogleAccessToken, 25, 1);

. Я также проверил, существует ли токен State.GoogleAccess, просто отобразив его на моем экране, прежде чем запускать метод, которыйделает этот вызов.

Опять же, если я произвожу

var calendars = GoogleConsumer.GetContacs(Global.GoogleWebConsumer, State.GoogleAccessToken, 25, 1);

, то это работает ???????Спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 10 января 2011

Большую часть выходных я мучаюсь в течение большей части выходных.

Я думаю, что после долгих раздумий с Fiddler, я нашел причину и нашел решение, которое, хотя и не очень, кажетсяработать.Я обнаружил, что смог получить доступ к каналу календаря, скопировав и вставив сгенерированный DNOA Uri в браузер, но всегда получал 401 при попытке программного доступа.Очевидно, это происходит потому, что стандартное поведение HttpWebRequest при автоматическом перенаправлении отбрасывает все файлы cookie, которые пытается установить перенаправление.Фид контактов не устанавливает файлы cookie во время перенаправления, поэтому он неуязвим.

При первом запросе фида календаря (даже с правильно сконструированным и подписанным запросом OAuth) Google отвечает перенаправлением, содержащимпеченье.Если вы не предоставите этот «календарный файл cookie» одновременно с запросом фида, вы получите 401 Несанкционированный при попытке выполнить перенаправление на канал.

вот заголовок настройки cookie от Google:

HTTP/1.1 302 Moved Temporarily
Set-Cookie: S=calendar=y7AlfgbmcqYl0ugrF-Zt9A;Expires=Tue, 10-Jan-2012 03:54:20 GMT;Secure

Вот что я делаю, чтобы заставить его работать:

// wc: WebConsumer
var calRequest = wc.PrepareAuthorizedRequest(erp2, authTokenRsp.AccessToken);
// need to stop redirect to capture calendar cookie token:
calRequest.AllowAutoRedirect = false;
var calResponse = calRequest.GetResponse();
var redirectCookie = calResponse.Headers[System.Net.HttpResponseHeader.SetCookie];

var cookiedCalRequest = wc.PrepareAuthorizedRequest(erp2, authTokenRsp.AccessToken);
cookiedCalRequest.Headers[System.Net.HttpRequestHeader.Cookie] = redirectCookie;
var calFeedResponse = cookiedCalRequest.GetResponse();
1 голос
/ 02 октября 2010

Читали ли вы документацию по API данных Календаря Google, чтобы убедиться, что у вас запрограммированы нужные конечные точки?Вы также изменили код, который получает токен доступа, чтобы запрашивать доступ к Календарю Google в дополнение к Контактам Google?Маркер доступа в образце получает только разрешения «Контакты», если вы его не изменили.

...