0

Google API v3 Calendarlist にアクセスしようとしていますが、ユーザーに有効な AccessToken があるにもかかわらず、401/404 応答が返され続けます。( Web サーバー アプリケーション
の OAuth2 プロトコルを完了し、 https://www.googleapis.com/auth/calendarパーミッションを受け取りました)

これに関する適切なドキュメントを見つけるのはかなり困難でした。Google サイト自体はあまり役に立たず、検索は古い v2 情報でいっぱいであるか、SDK を使用しています。通常、Python の返信を C# に翻訳することで間に合わせることができますが、この場合でもそれは役に立ちませんでした。

だから私は髪を引っ張っていますが、おそらくここでパラメーターの欠落などの非常に単純なことを忘れているので、誰かがこのコードをざっと見て、私が間違っていることを教えていただければ幸いです.

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;

前もって感謝します!

4

1 に答える 1

1

この質問を読んで答えを見つけました。

どうやら、Google のドキュメントにはまったく記載さていませんが、パラメータ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;
于 2012-11-16T14:26:41.010 に答える