Calendar Service バージョン 3 を使用するために ASP.NET の Google 標準ライブラリを使用しており、Google API コンソールを介して OAuth 2.0 認証用のサービス アカウント タイプを設定しています。今私の名前の目的は、OAuth2 を使用してカレンダーを接続することです。ほとんどのユーザーにとっては問題なく動作していますが、一部の限られたユーザーにとっては問題が発生しているため、error=access_denied が発生しています。以下のコードを使用して、OAuth 2 から認証を受けています。
private static string PrivateFeed = @"https://www.googleapis.com/auth/calendar";
public static string GenerateGoogleOAuthURL(String ReturnUrl)
{
string Url = "https://accounts.google.com/o/oauth2/auth?scope={0}&redirect_uri={1}&response_type={2}&client_id={3}&state={4}&access_type={5}&approval_prompt={6}";
string scope = UrlEncodeForGoogle(PrivateFeed).Replace("%20", "+");
string redirect_uri_encode = UrlEncodeForGoogle(ReturnUrl);
string response_type = "code";
string state = "";
string access_type = "offline";
string approval_prompt = "force";
String ClientID = ConfigurationManager.AppSettings["clientID"].ToString();
return string.Format(Url, scope, redirect_uri_encode, response_type, ClientID, state, access_type, approval_prompt);
}
リダイレクトページに戻っている間、以下のコードを使用して更新トークンを取得しています:-
private String ExchangeCodeWithAccessAndRefreshToken()
{
string Url = "https://accounts.google.com/o/oauth2/token";
string grant_type = "authorization_code";
string redirect_uri_encode = string.Empty;
redirect_uri_encode = UrlEncodeForGoogle(Convert.ToString(Session["URL"]));
string data = "code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type={4}";
string Code = Request.QueryString["Code"];
String ClientID = ConfigurationManager.AppSettings["clientID"].ToString();
String ClientSecret = ConfigurationManager.AppSettings["clientSecret"].ToString();
try
{
HttpWebRequest request = HttpWebRequest.Create(Url) as HttpWebRequest;
string result = string.Empty;
request.Method = "POST";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
string param = string.Format(data, Code, ClientID, ClientSecret, redirect_uri_encode, grant_type);
var bs = Encoding.UTF8.GetBytes(param);
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse response = request.GetResponse())
{
var sr = new StreamReader(response.GetResponseStream());
result = sr.ReadToEnd();
sr.Close();
}
if (!string.IsNullOrEmpty(result))
{
var jsonSerializer = new JavaScriptSerializer();
var tokenData = jsonSerializer.Deserialize<GoogleTokenModel>(result);
return tokenData.Refresh_Token;
}
}
catch (Exception ex)
{
}
return "";
}