仅在必要时刷新访问令牌

时间:2013-10-11 08:11:24

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

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;
}

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

  1. 您不能主动刷新,让事务失败401,然后获取新令牌并重试事务。有效利用带宽和处理,但会导致交易延迟。
  2. 您可以记下令牌的到期时间,并创建一个计时器任务,以便在它到期前1分钟刷新令牌。提供最佳性能,因为总有令牌可用,但会消耗带宽和处理时间。
  3. 在尝试交易之前,请检查令牌超时。如果它是 过期,获得一个新的,然后提交交易。如果它有<五 分钟生活,使用它和交易完成后, 刷新令牌准备下次。这给了(至少我的用例)在高效事务之间的最佳平衡,而不是进行太多的冗余刷新。