Google OAuth2トークンの有効期限の管理を誰かが解決したかどうか疑問に思っていますか?
以下の例は、有効なトークンを持つカレンダーのリストを取得するためのREST呼び出しです。トークンの有効期限が切れると、401応答が返され、データベースに保存されている「refreshtoken」を使用してトークンを更新する必要があります。誰かが彼らのウェブアプリケーションのためにこれに関する戦略を持っているかどうか疑問に思いますか?
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-通話の応答ステータスをキャッチし、401を確認します。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;
}