3

我想知道是否有人解决了管理 Google OAuth2 令牌的过期问题?

下面的示例是一个 REST 调用,用于获取具有有效令牌的日历列表。如果令牌已过期,我将收到 401 响应,并且需要使用存储在我的数据库中的“刷新令牌”来刷新令牌。我想知道是否有人为他们的 Web 应用程序制定了策略?

     var httpContent = new HttpRequestMessage(HttpMethod.Get, "https://www.googleapis.com/calendar/v3/users/me/calendarList");
            httpContent.Headers.Add("Authorization", "OAuth " + token);
            responseBody = client.SendAsync(httpContent).Result.EnsureSuccessStatusCode().Content.ReadAsStringAsync().Result;

我考虑过在用户登录时自动刷新并保存会话中加密的刷新令牌,但不确定是否有更好的策略。

//笔记策略选项:

1 - 登录用户后,刷新用户的所有 OAuth 令牌。假设会话永远不会持续超过令牌超时期限,则此方法有效。(可能对所有 OAuth 服务器都不可靠)。

2 - 刷新时,使用令牌过期在数据库中记录过期日期/时间。在调用任何 API 之前,请检查令牌是否需要刷新。(仍然需要考虑令牌在正常到期计划之外意外到期的边缘情况)

3 - 捕捉呼叫的响应状态并检查 401s。如果收到 401,请刷新令牌并重试。这可能是两个选项 1/2 的故障转移。此示例的代码将在此处:

  var restClient = new RestClient();
        var request = new RestRequest("https://www.googleapis.com/calendar/v3/users/me/calendarList", Method.GET);
        request.AddHeader("Authorization", "OAuth " + token);

        // execute the request
        var response = restClient.Execute(request);
        if (response.StatusCode == HttpStatusCode.Unauthorized)
        {
            var newToken = RefreshGoogleToken(token);
            request = new RestRequest("https://www.googleapis.com/calendar/v3/users/me/calendarList", Method.GET);
            request.AddHeader("Authorization", "OAuth " + newToken);

            // execute the request
            response = restClient.Execute(request);
        }
        var content = response.Content; // raw content as string
        dynamic responseJson = JsonValue.Parse(content);

        var calendarList = new List<GoogleCalendar>();
        foreach (var item in responseJson.items)
        {
            var calendar = new GoogleCalendar { Kind = item.kind, Etag = item.etag, Id = item.id, Title = item.summary, Description = item.description, Location = item.location, Timezone = item.timeZone, SummaryOverride = item.summaryOverride, ColorId = item.colorId, AccessRole = item.accessRole };
            if (item.defaultReminders != null)
            {
                calendar.DefaultReminders = new List<GoogleCalendarReminder>();
                foreach (var reminder in item.defaultReminders)
                {
                    var rem = new GoogleCalendarReminder { Method = reminder.method, Minutes = reminder.minutes };
                    calendar.DefaultReminders.Add(rem);
                }
            }

            calendarList.Add(calendar);
        }

        return calendarList;
    }
4

1 回答 1

0

如果知道过期时间,您可以跟踪令牌的过期时间并预计它已经过期,然后在那个时候进行刷新。

我想你也可以简单地通过刷新来响应 401 错误,甚至在到期跟踪发生失败时作为故障保险(只要确保添加代码以避免陷入循环)。

于 2012-06-29T14:11:48.573 回答