gpt4 book ai didi

c# - DotNetOpenAuth 与谷歌日历提要

转载 作者:太空狗 更新时间:2023-10-29 21:42:01 25 4
gpt4 key购买 nike

几天来,我一直在绞尽脑汁,试图使用 DotNetOpenAuth 从 Google 获取日历列表。

我可以使用 DotNetOpenAuth 示例成功获取联系人列表。我使用 OpenId+OAuth 将它与我的域集成。获取联系人列表一切正常。

因此,我从那里修改了代码以尝试检索日历列表,但我不断收到 401 未经授权的错误。

我知道它正在授权,因为我可以获得联系人列表。有没有人有代码示例如何使用 Google 的 DotNetOpenAuth 检索日历或日历事件???

谢谢

更新:

感谢您的回复。我已经阅读了所有可以拿到手的东西。这是我到目前为止所做的

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

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

第 2 步:接下来,我在 GoogleConsumer.cs 中创建了一个仿照 GetContacts 方法的新方法 GetCalendars -(重建了 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 修改为来自 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 Unauthorized

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

我还检查了 State.GoogleAccess token 是否存在,只需在我触发进行此调用的方法之前将其显示在我的屏幕上即可。

再次,如果我执行

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

然后就可以了??????感谢您的帮助。

最佳答案

在周末的大部分时间里,我一直在经历完全相同的事情。

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

您第一次请求日历提要时(即使使用正确构造和签名的 OAuth 请求),Google 也会回复包含 cookie 的重定向。如果您没有在请求供稿的同时显示该“日历 cookie”,那么当您尝试按照重定向到供稿时,您将收到 401 Unauthorized。

这是来自 Google 的 cookie 设置 header :

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

关于c# - DotNetOpenAuth 与谷歌日历提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3844998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com