Configuration de l'accès API OAuth 2.0 aux services Google
Créer un projet Google Developer Console pour l’accès API
Créer un projet dans Google Developer Console est une étape essentielle pour accéder aux API Google et les utiliser dans vos applications. Ce processus comprend la configuration d’un projet, l’acceptation des conditions, la vérification de votre identité et le paramétrage des API selon vos besoins. Les étapes suivantes vous guideront dans la création d’un projet et l’obtention des identifiants requis pour les services comme les API Calendar et Contacts.
Étapes pour créer un projet dans Google Developer Console
- Allez à l’adresse https://cloud.google.com/console/project et connectez‑vous avec vos identifiants Gmail
![]() |
|---|
- Cochez la case « I have read and agree to all Terms of Service for the Google Cloud Platform products. » et cliquez sur le bouton Créer
![]() |
|---|
- "SMS Verification" sera demandée. Appuyez sur le bouton Continuer :
![]() |
|---|
- Entrez le nom de votre pays et votre numéro de mobile. Appuyez sur le bouton : Envoyer le code de vérification
![]() |
|---|
- Entrez le code de vérification reçu sur votre mobile.
![]() |
|---|
- Dans la liste APIs & auth \ APIs, activez le statut de l’API Calendar et de l’API Contacts. Désactivez toutes les autres.
![]() |
|---|
- Dans APIs & auth -> Credentials, appuyez sur le bouton « CREATE NEW CLIENT ID » sous la section « OAuth ». Sélectionnez « Installed application » et « Other » parmi les choix proposés, puis cliquez sur le bouton « Create Client ID ». Notez le Client ID et le Client Secret ici qui seront utilisés dans les exemples de code de cette section.
![]() |
|---|
Intégration sécurisée de Google OAuth 2.0
Lorsque vous travaillez avec Google OAuth 2.0 dans Aspose.Email pour .NET, vous aurez besoin des classes suivantes :
-
GoogleOAuthHelper class - Simplifie le processus d’authentification d’un utilisateur Google et l’obtention des jetons nécessaires pour interagir avec les API Google, telles que Calendar, Contacts et Gmail.
-
GoogleUser class - Elle est conçue pour encapsuler et gérer les informations d’identification requises pour qu’un utilisateur s’authentifie et interagisse avec les services Google, en particulier les API nécessitant une authentification OAuth 2.0 comme Google Calendar.
-
TokenResponse class - Il s’agit d’un modèle conçu pour représenter et gérer les données de réponse d’un point de terminaison de jeton OAuth 2.0, où les jetons d’accès sont obtenus en échange d’une autorisation.
Dans les articles suivants, vous trouverez des exemples de code démontrant comment utiliser ces classes dans l’environnement .NET pour établir une interaction sécurisée avec les services OAuth 2.0.
Authentification OAuth 2.0 avec la classe GoogleOAuthHelper
La classe gère la création de l’URL du code d’autorisation, la génération des défis de code et la récupération des jetons d’accès et de rafraîchissement. En utilisant GoogleOAuthHelper, les développeurs peuvent rationaliser le flux OAuth 2.0, assurant une communication sécurisée et efficace avec les services Google. Le fragment de code suivant montre comment implémenter le GoogleOAuthHelper classe dans un projet :
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// Developer console:
/// https://console.cloud.google.com/projectselector2
/// Documentation:
/// https://developers.google.com/identity/protocols/oauth2/native-app
/// </summary>
internal class GoogleOAuthHelper
{
public const string AUTHORIZATION_URL = "https://accounts.google.com/o/oauth2/v2/auth";
public const string TOKEN_REQUEST_URL = "https://oauth2.googleapis.com/token";
public const string REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
public const string REDIRECT_TYPE = "code";
public static string codeVerifier;
public static string codeChallenge;
public static CodeChallengeMethod codeChallengeMethod = CodeChallengeMethod.S256;
public const string SCOPE =
"https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" + // Calendar
"+" +
"https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds%2F" + // Contacts
"+" +
"https%3A%2F%2Fmail.google.com%2F"; // IMAP & SMTP
static GoogleOAuthHelper()
{
CreateCodeVerifier();
CreateCodeChallenge();
}
internal static string CreateCodeVerifier()
{
string allowedChars = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz-._~";
const int minLength = 43;
const int maxLength = 128;
Random random = new Random();
int length = minLength + random.Next(maxLength - minLength);
List<char> codeVerifierChars = new List<char>();
for (int i = 0; i < length; i++)
{
int index = random.Next(allowedChars.Length);
codeVerifierChars.Add(allowedChars[index]);
}
return codeVerifier = string.Join("", codeVerifierChars.ToArray());
}
internal static string CreateCodeChallenge()
{
if (codeChallengeMethod == CodeChallengeMethod.Plain)
return codeChallenge = codeVerifier;
byte[] hashValue = null;
using (SHA256 sha256 = SHA256.Create())
hashValue = sha256.ComputeHash(Encoding.ASCII.GetBytes(codeVerifier));
string b64 = Convert.ToBase64String(hashValue);
b64 = b64.Split('=')[0];
b64 = b64.Replace('+', '-');
b64 = b64.Replace('/', '_');
return codeChallenge = b64;
}
internal static string GetAuthorizationCodeUrl(GoogleUser user)
{
return GetAuthorizationCodeUrl(user, SCOPE, REDIRECT_URI, REDIRECT_TYPE);
}
internal static string GetAuthorizationCodeUrl(
GoogleUser user, string scope, string redirectUri, string responseType)
{
string state = System.Web.HttpUtility.UrlEncode(Guid.NewGuid().ToString());
string approveUrl = AUTHORIZATION_URL +
$"?client_id={user.ClientId}&redirect_uri={redirectUri}&response_type={responseType}&scope={scope}&" +
$"code_challenge={codeChallenge}&code_challenge_method={codeChallengeMethod.ToString()}&" +
$"state={state}";
return approveUrl;
}
internal static TokenResponse GetAccessTokenByRefreshToken(GoogleUser user)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(TOKEN_REQUEST_URL);
request.CookieContainer = new CookieContainer();
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string clientId = System.Web.HttpUtility.UrlEncode(user.ClientId);
string clientSecret = System.Web.HttpUtility.UrlEncode(user.ClientSecret);
string refreshToken = System.Web.HttpUtility.UrlEncode(user.RefreshToken);
string grantType = System.Web.HttpUtility.UrlEncode("refresh_token");
string encodedParameters = $"client_id={clientId}&client_secret={clientSecret}&refresh_token={refreshToken}&grant_type={grantType}";
byte[] requestData = Encoding.UTF8.GetBytes(encodedParameters);
request.ContentLength = requestData.Length;
if (requestData.Length > 0)
using (Stream stream = request.GetRequestStream())
stream.Write(requestData, 0, requestData.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string responseText = null;
using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
responseText = reader.ReadToEnd();
TokenResponse tokensResponse = JsonConvert.DeserializeObject<TokenResponse>(responseText);
return tokensResponse;
}
internal static TokenResponse GetAccessTokenByAuthCode(string authorizationCode, GoogleUser user)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(TOKEN_REQUEST_URL);
request.CookieContainer = new CookieContainer();
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string clientId = System.Web.HttpUtility.UrlEncode(user.ClientId);
string clientSecret = System.Web.HttpUtility.UrlEncode(user.ClientSecret);
string authCode = System.Web.HttpUtility.UrlEncode(authorizationCode);
string redirectUri = System.Web.HttpUtility.UrlEncode(REDIRECT_URI);
string grantType = System.Web.HttpUtility.UrlEncode("authorization_code");
string encodedParameters = $"client_id={clientId}&client_secret={clientSecret}&code={authCode}&code_verifier={codeVerifier}&redirect_uri={redirectUri}&grant_type={grantType}";
byte[] requestData = Encoding.UTF8.GetBytes(encodedParameters);
request.ContentLength = requestData.Length;
if (requestData.Length > 0)
using (Stream stream = request.GetRequestStream())
stream.Write(requestData, 0, requestData.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string responseText = null;
using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
responseText = reader.ReadToEnd();
TokenResponse tokensResponse = JsonConvert.DeserializeObject<TokenResponse>(responseText);
return tokensResponse;
}
public enum CodeChallengeMethod
{
S256,
Plain
}
}
Google OAuth Helper doit être utilisé comme suit :
- Une URL de code d’autorisation doit d’abord être générée.
- Ouvrez l’URL dans un navigateur et effectuez toutes les opérations. En conséquence, vous recevrez un code d’autorisation.
- Utilisez le code d’autorisation pour recevoir un jeton d’actualisation.
- Lorsque le jeton d’actualisation existe, vous pouvez l’utiliser pour récupérer les jetons d’accès.
GoogleUser user = new GoogleUser(email, password, clientId, clientSecret);
string authUrl = GoogleOAuthHelper.GetAuthorizationCodeUrl(user);
Console.WriteLine("Go to the following URL and get your authorization code:");
Console.WriteLine(authUrl);
Console.WriteLine();
Console.WriteLine("Enter the authorization code:");
string authorizationCode = Console.ReadLine();
Console.WriteLine();
TokenResponse tokenInfo = GoogleOAuthHelper.GetAccessTokenByAuthCode(authorizationCode, user);
Console.WriteLine("The refresh token has been received:");
Console.WriteLine(tokenInfo.RefreshToken);
Console.WriteLine();
user.RefreshToken = tokenInfo.RefreshToken;
tokenInfo = GoogleOAuthHelper.GetAccessTokenByRefreshToken(user);
Console.WriteLine("The new access token has been received:");
Console.WriteLine(tokenInfo.AccessToken);
Console.WriteLine();
Classe GoogleUser pour l’authentification OAuth 2.0
Le fragment de code suivant montre comment implémenter le GoogleUser classe:
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class GoogleUser
{
public GoogleUser(string email, string password, string clientId, string clientSecret)
: this(email, password, clientId, clientSecret, null)
{
}
public GoogleUser(string email, string password, string clientId, string clientSecret, string refreshToken)
{
Email = email;
Password = password;
ClientId = clientId;
ClientSecret = clientSecret;
RefreshToken = refreshToken;
}
public readonly string Email;
public readonly string Password;
public readonly string ClientId;
public readonly string ClientSecret;
public string RefreshToken;
}
Authentifier avec OAuth 2.0 en utilisant la classe TokenResponse
Le fragment de code suivant montre comment le TokenResponse La classe peut être implémentée :
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using Newtonsoft.Json;
public class TokenResponse
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "access_token", Required = Required.Default)]
public string AccessToken { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "token_type", Required = Required.Default)]
public string TokenType { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "expires_in", Required = Required.Default)]
public int ExpiresIn { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "refresh_token", Required = Required.Default)]
public string RefreshToken { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "scope", Required = Required.Default)]
public string Scope { get; set; }
}






