Mi sono tormentato per qualche giorno cercando di ottenere un elenco di calendari da Google utilizzando DotNetOpenAuth.DotNetOpenAuth con Google Calendar Feed
Posso ottenere correttamente un elenco di contatti utilizzando gli esempi DotNetOpenAuth. L'ho integrato con il mio dominio usando OpenId + OAuth. Tutto funziona alla grande per ottenere un elenco di contatti.
Quindi da lì ho modificato il codice per provare a recuperare un elenco di calendari e continuo a ricevere un errore 401 non autorizzato.
So che è l'autorizzazione perché posso ottenere l'elenco dei contatti. Qualcuno ha un esempio di codice su come stanno recuperando calendari o eventi del calendario usando DotNetOpenAuth con Google ???
Grazie
Aggiornamento:
Grazie per la risposta. Ho letto tutto ciò su cui riesco a mettere le mani. Ecco quello che ho fatto finora
Fase 1: Ho creato un nuovo GetCalendarEndPoint nelle GoogleConsumer.cs
private static readonly MessageReceivingEndpoint GetCalendarEndpoint = new MessageReceivingEndpoint("https://www.google.com/calendar/feeds/default", HttpDeliveryMethods.GetRequest);
Fase 2: Poi ho creato un nuovo metodo GetCalendars fantasia dopo la getContacts Metodo GoogleConsumer. cs - (Ricostruita la dll ecc)
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;
Fase 3: nella mia applicazione ho modificato lo ScopeURI al calendario URI da GoogleConsumer come segue
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;
}
Tuttavia, quando faccio funzionare l'applicazione ottengo 401 non autorizzato quando faccio la seguente chiamata
var calendars = GoogleConsumer.GetCalendars(Global.GoogleWebConsumer, State.GoogleAccessToken, 25, 1);
ho anche verificato che il token State.GoogleAccess esiste semplicemente la visualizzazione sul mio schermo prima di innescare la metodo che effettua questa chiamata.
Anche in questo caso, se io exectute
var calendars = GoogleConsumer.GetContacs(Global.GoogleWebConsumer, State.GoogleAccessToken, 25, 1);
allora funziona ??????? Grazie per il tuo aiuto.
sarebbe eventualmente avere a che fare con il modo in cui stiamo creando la richiesta dal momento che il punto finale per Contatti è HTTP e il punto finale per il Calendario è HTTPS? –
Assolutamente potrebbe essere. E ovviamente la creazione di MessageReceivingEndpoint è il codice che controlli, in modo da poterlo aggiustare. –
Riesci a vedere qualcosa nel mio codice che sto sbagliando o indicarmi la giusta direzione. Questo mi sta davvero bloccando. –