我想在 winforms 的網路瀏覽器控制元件中顯示我的 Google 日歷。
我試圖按照教程https://www.daimto.com/google-api-and-oath2/
但不幸的是,我仍然沒有獲得訪問我的谷歌日歷的權限,“瀏覽器不安全......”。
我知道我必須以某種方式使用訪問權限,但我不知道如何使用。
編碼:
public partial class Kalender : UserControl
{
public string clientId = "897492813624-glvfpm6heik1fqr7s2mjtl6eme5ad8bq.apps.googleusercontent.com";
public string redirectUri = "https://calendar.google.com/";
public string clientSecret = "HYGFBEd_BZPcWcrPopsX4uZr";
public string redirectURI = "https://calendar.google.com/";
public AuthResponse access;
public Kalender()
{
InitializeComponent();
webKalender.Navigate(AuthResponse.GetAutenticationURI(clientId, redirectUri));
}
private void webKalender_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
string Mytitle = ((WebBrowser)sender).DocumentTitle.ToLower();
if (Mytitle.IndexOf("success code=") > -1)
{
webKalender.Visible = false;
// searching the body for our code
string AuthCode = webKalender.DocumentTitle.Replace("Success code=", "");
string webText = ((WebBrowser)sender).DocumentText;
int start = webText.IndexOf("id=\"code\"");
start = webText.IndexOf(AuthCode, start);
int end = webText.IndexOf('"', start);
string authCode = webText.Substring(start, end - start);
//Exchange the code for Access token and refreshtoken.
access = AuthResponse.Exchange(authCode, clientId, clientSecret, redirectURI);
//processAccess();
}
}
教程中的類:
public class AuthResponse
{
private string access_token;
public string Access_token
{
get
{
// Access token lasts an hour if its expired we get a new one.
if (DateTime.Now.Subtract(created).Hours > 1)
{
refresh();
}
return access_token;
}
set { access_token = value; }
}
public string refresh_token { get; set; }
public string clientId { get; set; }
public string secret { get; set; }
public string expires_in { get; set; }
public DateTime created { get; set; }
//"{\n \"access_token\" : \"ya29.kwFUj-la2lATSkrqFlJXBqQjCIZiTg51GYpKt8Me8AJO5JWf0Sx6-0ZWmTpxJjrBrxNS_JzVw969LA\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 3600,\n \"refresh_token\" : \"1/ejoPJIyBAhPHRXQ7pHLxJX2VfDBRz29hqS_i5DuC1cQ\"\n}"
public static AuthResponse get(string response)
{
AuthResponse result = (AuthResponse)JsonConvert.DeserializeObject(response);
result.created = DateTime.Now; // DateTime.Now.Add(new TimeSpan(-2, 0, 0)); //For testing force refresh.
return result;
}
public void refresh()
{
var request = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");
string postData = string.Format("client_id={0}&client_secret={1}&refresh_token={2}&grant_type=refresh_token", this.clientId, this.secret, this.refresh_token);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
var refreshResponse = AuthResponse.get(responseString);
this.access_token = refreshResponse.access_token;
this.created = DateTime.Now;
}
public static AuthResponse Exchange(string authCode, string clientid, string secret, string redirectURI)
{
var request = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");
string postData = string.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code", authCode, clientid, secret, redirectURI);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
var x = AuthResponse.get(responseString);
x.clientId = clientid;
x.secret = secret;
return x;
}
public static Uri GetAutenticationURI(string clientId, string redirectUri)
{
string scopes = "https://www.googleapis.com/auth/calendar";
if (string.IsNullOrEmpty(redirectUri))
{
redirectUri = "urn:ietf:wg:oauth:2.0:oob";
}
string oauth = string.Format("https://accounts.google.com/o/oauth2/auth?client_id={0}&redirect_uri={1}&scope={2}&response_type=code", clientId, redirectUri, scopes);
return new Uri(oauth);
}
}


為德語感到抱歉,但它說的是:“瀏覽器或應用程式我不安全。使用不同的瀏覽器。”
uj5u.com熱心網友回復:
我想在 winforms 的網路瀏覽器控制元件中顯示我的 Google 日歷。
您應該了解的第一件事是,如果您嘗試做的是在您的應用程式中顯示 Google 日歷網路應用程式,那么如果不使用該代碼或任何代碼,它將無法作業。
您可以做的是使用 Google 日歷 api 訪問 Google 日歷資料,然后在您的網路表單中創建您自己的資料顯示。
這就是您使用的代碼的目的。然而,它已經超過九歲了。
如果可能,您應該使用 Google .net 客戶端庫。話雖如此,您正在使用的代碼最初是在九年前為 .Net 3.5 撰寫的。google .net 客戶端庫不支持 .net 3.5。(我指的不是 .Net core 3.1,我們說的是更早的版本。)
從那時起,安全性發生了很多變化。如果 Google 檢測到您正在 webview 中打開它,那么它可能無法正常作業。這些天驗證螢屏作業的唯一方法是在機器上安裝的瀏覽器中打開 oauth 視窗。
.net 客戶端庫就是為了做到這一點而設計的。
這是一些讓您入門的授權代碼。
public static class Oauth2Example
{
/// <summary>
/// ** Installed Aplication only **
/// This method requests Authentcation from a user using Oauth2.
/// </summary>
/// <param name="clientSecretJson">Path to the client secret json file from Google Developers console.</param>
/// <param name="userName">Identifying string for the user who is being authentcated.</param>
/// <param name="scopes">Array of Google scopes</param>
/// <returns>CalendarService used to make requests against the Calendar API</returns>
public static CalendarService GetCalendarService(string clientSecretJson, string userName, string[] scopes)
{
try
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(clientSecretJson))
throw new ArgumentNullException("clientSecretJson");
if (!File.Exists(clientSecretJson))
throw new Exception("clientSecretJson file does not exist.");
var cred = GetUserCredential(clientSecretJson, userName, scopes);
return GetService(cred);
}
catch (Exception ex)
{
throw new Exception("Get Calendar service failed.", ex);
}
}
/// <summary>
/// ** Installed Aplication only **
/// This method requests Authentcation from a user using Oauth2.
/// Credentials are stored in System.Environment.SpecialFolder.Personal
/// Documentation https://developers.google.com/accounts/docs/OAuth2
/// </summary>
/// <param name="clientSecretJson">Path to the client secret json file from Google Developers console.</param>
/// <param name="userName">Identifying string for the user who is being authentcated.</param>
/// <param name="scopes">Array of Google scopes</param>
/// <returns>authencated UserCredential</returns>
private static UserCredential GetUserCredential(string clientSecretJson, string userName, string[] scopes)
{
try
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(clientSecretJson))
throw new ArgumentNullException("clientSecretJson");
if (!File.Exists(clientSecretJson))
throw new Exception("clientSecretJson file does not exist.");
// These are the scopes of permissions you need. It is best to request only what you need and not all of them
using (var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read))
{
string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
// Requesting Authentication or loading previously stored authentication for userName
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
scopes,
userName,
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
credential.GetAccessTokenForRequestAsync();
return credential;
}
}
catch (Exception ex)
{
throw new Exception("Get user credentials failed.", ex);
}
}
/// <summary>
/// This method get a valid service
/// </summary>
/// <param name="credential">Authecated user credentail</param>
/// <returns>CalendarService used to make requests against the Calendar API</returns>
private static CalendarService GetService(UserCredential credential)
{
try
{
if (credential == null)
throw new ArgumentNullException("credential");
// Create Calendar API service.
return new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Calendar Oauth2 Authentication Sample"
});
}
catch (Exception ex)
{
throw new Exception("Get Calendar service failed.", ex);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318273.html
標籤:C# winforms 验证 谷歌oauth 谷歌日历 API
