【问题标题】:Refreshing access token only when necessary仅在必要时刷新访问令牌
【发布时间】:2013-10-19 06:00:37
【问题描述】:

按照previous question posted here,我正在尝试从服务器应用程序使用日历服务。

我“自己”管理身份验证流程,并将用户的访问令牌和刷新令牌存储在数据库中。现在我想我可以使用 .NET 客户端示例中显示的方法来使用CalendarService。但我仍然想知道 IAuthorizationState GetAuthorization(WebServerClient client) 方法的最佳实现是什么,以便仅在需要时请求刷新访问令牌。我当前的幼稚实现每次都会刷新令牌:

private IAuthorizationState GetAuthorization(WebServerClient client)
{
    IAuthorizationState state = new AuthorizationState(new[] { "profile", CalendarService.Scopes.Calendar.GetStringValue() });
    state.AccessToken = _accessToken;
    state.RefreshToken = _refreshToken;

    client.RefreshToken(state);

    return state;
}

...但我确信有更聪明的方法可以做到这一点!

提前致谢。

【问题讨论】:

    标签: c# authentication oauth-2.0 google-oauth google-api-dotnet-client


    【解决方案1】:

    您可以使用多种流,具体取决于对性能、带宽、会话长度等的需求。

    1. 你可以不做主动刷新,让事务失败401,然后获取一个新的token,重试事务。有效利用带宽和处理,但会导致交易延迟。
    2. 您可以记下令牌的到期时间,并创建一个计时器任务以在令牌到期前 1 分钟刷新令牌。提供最佳性能,因为始终有可用的令牌,但会消耗带宽和处理时间。
    3. 在尝试事务之前,请检查令牌超时。如果它是 过期了,换一个新的,然后提交交易。如果它有

    【讨论】:

    • 对。我想知道 .NET 客户端库是否可以自动执行您的第一个案例,但缺乏文档使其成为猜谜游戏。我会将访问令牌的过期日期存储在数据库中,如果我们即将过期,我会根据每个请求触发刷新。
    • 出于同样的原因,我放弃了 Google 库。
    • 过去几周一直在努力提供更好的 OAuth2 体验。大部分代码已经在存储库中,并且在不久的将来会有几次代码审查。在接下来的几周内,我们将发布 1.6.0-beta,它将为 WP、WinRT、MVC、.NET 4 和 .NET 4.5 应用程序的 OAuth2 提供更好的开发人员体验。我们也会改进文档。很抱歉到目前为止给您带来了不好的体验,但我们正在努力解决这个问题......请随时在我们的问题跟踪器 code.google.com/p/google-api-dotnet-client/issues/list 中打开一个新问题。
    • @peleyal 这是个好消息。公平地说,它是我放弃的 Java 库,所以也许 dotnet 库比它的 Java 库更好。实际上,我很高兴自己做 Oauth,所以可能永远不会切换回去,但为了那些可能跟随的人,需要有一个坚如磐石的合约作为抽象 API 的一部分;开发人员没有猜测工作。它还需要从 Beta 版中出来,然后我才能在生产中使用它(公司政策)。
    • 我们知道这一点。感谢@pinoyyid 的反馈。我知道 OAuth2 的体验现在很糟糕。希望它会很快改变。再次感谢。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2022-10-31
    • 2019-06-29
    • 1970-01-01
    • 2020-07-12
    • 2019-01-13
    相关资源
    最近更新 更多