2012-11-16 2 views
0

Google API v3 캘린더 목록에 액세스하려고하지만 사용자에 대해 유효한 AccessToken이 있어도 401/404 응답을 계속받습니다.
는 (내가 OAuth2 protocol for Web Server Applications을 완료하고 https://www.googleapis.com/auth/calendar 허가를받은)Google 캘린더 API v3 : 캘린더 목록을 검색하기 위해 AccessToken 사용

이 좋은 문서를 찾기 위해 오히려 어려운이었다, 구글 사이트 자체가 매우 도움이되지 않습니다 및 검색 오래된 v2에 정보의 전체 또는 SDK를 사용합니다. 보통 나는 파이썬 응답을 C#으로 번역 할 수 있지만이 경우조차도 도움이되지 않습니다.

그래서 머리카락을 꺼내지 만 누락 된 매개 변수 또는 somesuch와 같은 매우 간단한 것을 여기에서 잊어 버릴 수 있습니다. 따라서 누군가이 코드를 빠르게 살펴보고 내가 무엇을 말해 주면 대단히 감사하겠습니다. 잘못하고있어.

var applicationKey = moduleModel.Application.Key; 
var userID = moduleModel.User.UserID; 
var accessToken = moduleModel.User.AccessToken.Token; 

// It doesn't seem to make any difference whether I use the querystring 
// parameter or the request header to specify the access_token 
var sendAccessTokenAsHeader = 
    !(Request.QueryString["SendAccessTokenAsHeader"] == "0"); 

// I tried navigating to a specific user but it results in a 404 Not Found 
var requestSpecificUserID = 
    Request.QueryString["RequestSpecificUserID"] == "1"; 

// Including or omitting my API_KEY doesn't seem to make any difference 
var sendApplicationKey = 
    !(Request.QueryString["SendApplicationKey"] == "0"); 

var urlBuilder = new System.Text.StringBuilder(); 

urlBuilder.Append("https://"); 
urlBuilder.Append("www.googleapis.com"); 

if (requestSpecificUserID) 
{ 
    urlBuilder.Append 
     (string.Format("/calendar/v3/users/{0}/calendarList", userID)); 
} 
else 
{ 
    urlBuilder.Append 
     ("/calendar/v3/users/me/calendarList"); 
} 

var parameterJoiner = "?"; 

if (sendApplicationKey) 
{ 
    urlBuilder.Append 
    (
     string.Format 
     (
      "{0}{1}={2}", 
      parameterJoiner, 
      "key", 
      HttpUtility.UrlEncode(applicationKey) 
     ) 
    ); 
    parameterJoiner = "&"; 
} 

if (!sendAccessTokenAsHeader) 
{ 
    urlBuilder.Append 
    (
     string.Format 
     (
      "{0}{1}={2}", 
      parameterJoiner, 
      "access_token", 
      HttpUtility.UrlEncode(accessToken) 
     ) 
    ); 
    parameterJoiner = "&"; 
} 

var httpWebRequest = HttpWebRequest.Create(urlBuilder.ToString()) 
    as HttpWebRequest; 
httpWebRequest.CookieContainer = new CookieContainer(); 

if (sendAccessTokenAsHeader) 
{ 
    httpWebRequest.Headers["Authorization"] = string.Format 
    (
     "Bearer {0}", 
     accessToken 
    ); 
} 

// GetSafeResponse is just an extension method to catch the WebException 
// when the HttpStatusCode != OK 

var response = httpWebRequest.GetSafeResponse(); 

// returns 401 (requestSpecificUserID = false) 
// or 404 (requestSpecificUserID = true) 

var responseText = response.GetResponseText(); 

return responseText; 

감사합니다.

답변

1

this 질문을 읽고 대답했습니다. 구글 문서는 모든 그것을 을 언급하지 않더라도 분명히

, 매개 변수 minAccessRole이 필요합니다.

근무 예 :

var accessToken = moduleModel.User.AccessToken.Token; 

var urlBuilder = new System.Text.StringBuilder(); 

urlBuilder.Append("https://"); 
urlBuilder.Append("www.googleapis.com"); 
urlBuilder.Append("/calendar/v3/users/me/calendarList"); 
urlBuilder.Append("?minAccessRole=writer"); 

var httpWebRequest = HttpWebRequest.Create(urlBuilder.ToString()) 
    as HttpWebRequest; 

httpWebRequest.CookieContainer = new CookieContainer(); 
httpWebRequest.Headers["Authorization"] = 
    string.Format("Bearer {0}", accessToken); 

var response = httpWebRequest.GetSafeResponse(); 

var responseText = response.GetResponseText(); 

return responseText;