gpt4 book ai didi

c# - Google 日历返回无效补助金

转载 作者:行者123 更新时间:2023-12-02 01:33:17 25 4
gpt4 key购买 nike

我有一位客户正在尝试从我们的网络应用程序访问他们的日历。一切都适用于我们所有其他客户,因此我不确定这里有什么不同,除了该客户位于澳大利亚并使用非 gmail.com 电子邮件地址。

客户能够授权我们的应用程序,并且我们确实为用户获得了 oauth token 。我们请求日历访问权限,客户同意了。当我们请求所有日历的列表时,我们收到无效的授权消息。

下面是我们用来访问他们的日历的代码。被调用的方法是 GetAllWritableCalendars。

public class GoogleCalendarAdapter : ICalendarAdapter {
#region attributes
private readonly ISiteAuthTokenQueryRepository _tokenRepo;
private readonly GoogleCalendarSettings _settings;

private const string APPNAME = "SomeAppName";

private const string ACL_OWNER = "owner";
private const string ACL_WRITER = "writer";
#endregion

#region ctor
public GoogleCalendarAdapter(ISiteAuthTokenQueryRepository tokenRepo,
GoogleCalendarSettings settings) {
_tokenRepo = tokenRepo;
_settings = settings;
}
#endregion

#region methods
private GoogleAuthorizationCodeFlow BuildAuthorizationCodeFlow() {
return new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer() {
ClientSecrets = BuildClientSecrets(),
Scopes = BuildScopeList()
});
}

private CalendarService BuildCalendarService(SiteAuthToken token) {

return new CalendarService(new BaseClientService.Initializer() {
ApplicationName = APPNAME,
HttpClientInitializer = BuildUserCredential(token)
});
}

private ClientSecrets BuildClientSecrets() {
return new ClientSecrets() {
ClientId = _settings.ClientId,
ClientSecret = _settings.ClientSecret
};
}

private string[] BuildScopeList() {
return new [] { CalendarService.Scope.Calendar };
}

private UserCredential BuildUserCredential(SiteAuthToken token) {
TokenResponse responseToken = new TokenResponse() {
AccessToken = token.AccessToken,
RefreshToken = token.RefreshToken
};

return new UserCredential(BuildAuthorizationCodeFlow(), APPNAME, responseToken);
}

public async Task<List<Cal>> GetAllWritableCalendars(Guid siteGuid) {
SiteAuthToken token = await GetToken(siteGuid);
CalendarService svc = BuildCalendarService(token);

IList<CalendarListEntry> calendars = svc.CalendarList
.List()
.Execute()
.Items;

return calendars.Where(c => c.AccessRole.Equals(ACL_OWNER, StringComparison.CurrentCultureIgnoreCase) ||
c.AccessRole.Equals(ACL_WRITER, StringComparison.CurrentCultureIgnoreCase))
.Select(c => new Cal() {
Id = c.Id,
Name = c.Summary
})
.OrderBy(o => o.Name)
.ToList();
}

private async Task<SiteAuthToken> GetToken(Guid siteGuid) {
SiteAuthToken retVal = await _tokenRepo.GetSiteAuthToken(siteGuid);

if (retVal == null) {
throw new ApplicationException($"Could not find a SiteAuthToken for specified site (SiteGuid: {siteGuid})");
}

return retVal;
}

#endregion

最佳答案

凭据Google授权您的应用程序使用对于您设置的范围,如果您每次向应用程序添加新范围时都更新它,那么将其存在数据库中是可以的。

访问 token 用户您的应用程序<的授权/em> 获取 Google 数据(本例中为日历)。它的生命周期有限,因此不能保存在数据库中。

刷新 token 是允许您的应用程序为客户端获取更多 token 的 token 。它的使用生命周期也是有限的。

有关更多信息,请参阅:Using OAuth 2.0 to Access Google APIs

每次更改范围或添加更多范围时,您都必须重新生成凭据。每个客户端的每个用户帐户有 50 个刷新 token ,请参阅 Token expiration 。因此,将 token 存储在数据库中是没有意义的,因为它们会在某个时候被弃用,如果您有 51 个客户端,则第一个 token 将被弃用。

检查:

  1. 如何在数据库中设置它
  2. 如果您正确续订 token
  3. 如果您为用户使用了正确的 token

您可以删除所有 token (不是凭据),您当前的用户只需通过同意屏幕并再次允许,他们就不会失去连接。

关于c# - Google 日历返回无效补助金,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272848/

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