2012-06-29 3 views
3

누구나 Google OAuth2 토큰의 만료 관리를 해결했는지 궁금합니다.C에서 Google REST API를 사용하여 Google 토큰 새로 고침

아래 예제는 유효한 토큰이있는 달력 목록을 가져 오는 REST 호출입니다. 토큰이 만료되면 401 응답을 받고 내 데이터베이스에 저장된 '새로 고침 토큰'을 사용하여 토큰을 새로 고쳐야합니다. 누군가가 자신의 웹 응용 프로그램에 대해이 전략을 가지고 있는지 궁금합니다.

 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을 받으면 토큰을 새로 고친 후 다시 시도하십시오. Options 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; 
    } 

답변

0

만료 시간은 당신이 당신의 토큰의 만료 시간을 추적하고 이미 만료 된 것을 예상 할 수 알려진 경우, 단지 그 당시 새로 고침을한다.

나는 또한 새로 고침을 사용하여 401 오류에 간단하게 응답 할 수 있다고 상상합니다. 만료 추적이 실패하면 실패 방지로도 사용할 수 있습니다 (루프에 걸리지 않도록 코드를 추가하십시오) .

+0

옵션에 추가되었습니다. 감사! –

관련 문제