2010-10-02 2 views
6

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

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

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

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

Благодаря

Update:

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

Шаг 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 - (перестроено дллы и т.д.)

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 Несанкционированное когда я делаю следующий вызов

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

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

Опять же, если я exectute

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

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

ответ

4

Я испытывал то же самое в течение большей части выходных.

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

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

вот печенья настройки заголовка от 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

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

+0

ли это, возможно, придется делать с тем, как мы создаем запрос, поскольку конечной точкой для контактов является HTTP, а конечной точкой для календаря является HTTPS? –

+1

Абсолютно это могло быть так. И, конечно же, создание MessageReceivingEndpoint - это код, которым вы управляете, чтобы вы могли его настроить. –

+0

Можете ли вы что-нибудь увидеть в моем коде, я делаю неправильно или укажу на меня в правильном направлении. Меня это сильно забивает. –

Смежные вопросы