我想知道是否有人解决了管理 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;
}