C# DotNetOpenAuth与谷歌日历订阅源

C# DotNetOpenAuth与谷歌日历订阅源,c#,asp.net,oauth,dotnetopenauth,google-calendar-api,C#,Asp.net,Oauth,Dotnetopenauth,Google Calendar Api,几天来,我一直在绞尽脑汁,试图使用DotNetOpenAuth从谷歌获得日历列表 我可以使用DotNetOpenAuth示例成功获取联系人列表。我已经使用OpenId+OAuth将其与我的域集成。每件事都能很好地获得联系人列表 因此,从那里我修改了代码,试图检索日历列表,我不断得到一个错误 我知道这是授权,因为我可以得到联系人名单。有没有人有一个代码示例,说明他们是如何使用DotNetOpenAuth和Google来检索日历或日历事件的 谢谢 更新: 谢谢你的回复。我已经读了所有我能弄到的东西。

几天来,我一直在绞尽脑汁,试图使用DotNetOpenAuth从谷歌获得日历列表

我可以使用DotNetOpenAuth示例成功获取联系人列表。我已经使用OpenId+OAuth将其与我的域集成。每件事都能很好地获得联系人列表

因此,从那里我修改了代码,试图检索日历列表,我不断得到一个错误

我知道这是授权,因为我可以得到联系人名单。有没有人有一个代码示例,说明他们是如何使用DotNetOpenAuth和Google来检索日历或日历事件的

谢谢

更新:

谢谢你的回复。我已经读了所有我能弄到的东西。以下是我迄今为止所做的工作

步骤1:我在GoogleConsumer.cs中创建了一个新的GetCalendarEndPoint

private static readonly MessageReceivingEndpoint GetCalendarEndpoint = new MessageReceivingEndpoint("https://www.google.com/calendar/feeds/default", HttpDeliveryMethods.GetRequest);
步骤2:接下来,我创建了一个新方法GetCalendars,该方法以GoogleConsumer.cs中的GetContacts方法为模式(重建dll等)

步骤3:在我的应用程序中,我将ScopeURI修改为GoogleConsumer的日历URI,如下所示

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令牌是否存在,方法是在触发调用该方法之前将其显示在屏幕上

再说一次,如果我执行

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

然后它就起作用了???????感谢您的帮助。

您是否阅读了Google Calendar data API文档,以确保在中编程了正确的端点?您是否也修改了获取访问令牌的代码,以请求除Google联系人外访问Google日历?样本中的访问令牌只有在您更改它的情况下才能获得联系人权限。

在周末的大部分时间里,我都在经历同样的事情

我想在和Fiddler玩了很多次之后,我找到了原因,并找到了一个解决方案,虽然不漂亮,但似乎有效。我发现我可以通过将DNOA生成的Uri复制并粘贴到浏览器中来访问日历提要,但在尝试编程访问时总是得到401。这显然是因为HttpWebRequest的默认自动重定向行为会丢弃重定向试图设置的任何cookie。联系人提要在重定向期间不设置任何cookie,因此它是免疫的

当您第一次请求日历提要时(即使使用正确构造和签名的OAuth请求),Google会用包含cookie的重定向进行回复。如果您不在提交源请求的同时提交“日历cookie”,那么当您尝试按照重定向到源时,您将获得未经授权的401

以下是来自Google的cookie设置标题:

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();

这是否可能与我们创建请求的方式有关,因为联系人的端点是HTTP,日历的端点是HTTPS?当然可能是这样。当然,MessageReceivingEndpoint的创建是由您控制的代码,因此您可以对其进行调整。您能看到我的代码中有什么地方我做错了或指向了正确的方向吗。这真让我难堪。
// 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();