Question

J'ai été à la recherche à la Oauth .Net Api Google afin de s'authentifier via OAuth et l'utilisation de l'Api Google drive.

Plus précisément, je veux utiliser un jeton d'actualisation j'ai déjà stockées dans l'ordre de l'utiliser pour instancier un sur googledrive service.

J'ai trouvé des échantillons comme https://code.google.com/p/google-api-dotnet-client/source/browse/Tasks.SimpleOAuth2/Program.cs?repo=samples

Qui semblent utiliser "GoogleWebAuthorizationBroker.AuthorizeAsync" mais je ne suis pas sûr de savoir comment je peux utiliser cette méthode avec un jeton d'actualisation plutôt que le client secrets vous semblez être de le nourrir dans cet exemple.

Était-ce utile?

La solution

Si je vous comprends correctement, vous demandez comment pouvez-vous créer un nouveau service Google, basé sur un jeton de rafraîchissement existant.

Donc, vous pouvez faire ce qui suit:

var token = new TokenResponse { RefreshToken = "YOUR_REFRESH_TOKEN_HERE" }; 
var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
    new GoogleAuthorizationCodeFlow.Initializer 
    {
      ClientSecrets = [your_client_secrets_here]
    }), "user", token);

Ensuite, vous pouvez transmettre vos informations d'identification à l'initialisation du service.

En faisant ce qui précède, GoogleAutorizedCodeflow obtiendra un nouveau jeton d'accès basé sur vous actualiser le jeton et les secrets des clients.

Notez que vous devez avoir des secrets de clients ici, sans cela, vous ne pourrez pas obtenir un jeton d'accès.

Autres conseils

Le client_secrets.json contient l'ID client et le secret du client (qui possède vos informations OAuth 2.0 pour votre application).

Je pense que cet article expliquera mieux comment vous pouvez utiliser OAuth 2.0 pour accéder aux API Google Apps, en particulier si vous construisez une application Web.

https://developers.google.com/accounts/docs/oauthethwebserver

Si vous êtes intéressé par un exemple de codage, il y en a un à Stackoverflow: Google+ API: Comment puis-je utiliser RefreshTokens pour éviter de demander un accès à chaque fois que mon application lance?

GoogleWebAuthorizeBroker exige que vous l'envoyiez une implication d'IdaTastore dans ce cas, le fichier FileDatastore est envoyé.FileDatastore stocke les données de% Appdata%.Si vous souhaitez utiliser un rafraîchissant, vous avez enregistré un autre endroit, vous devez créer votre propre implication d'IdataStore.

Le code pour le magasin de données réel i un peu longtemps à poster ici. http://daimto.com/google-oauth2-cshaarp/

Vous l'utilisez ensuite comme si vous voulez que le fichier ailedatastore

//Now we load our saved refreshToken.
StoredResponse myStoredResponse = new StoredResponse(tbRefreshToken.Text);
// Now we pass a SavedDatastore with our StoredResponse.
 using (var stream = new FileStream("client_secrets.json", FileMode.Open,
        FileAccess.Read))
  {
     GoogleWebAuthorizationBroker.Folder = "Tasks.Auth.Store";
     StoredCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
     GoogleClientSecrets.Load(stream).Secrets,
     new[] { DriveService.Scope.Drive,
     DriveService.Scope.DriveFile },
     "user",
      CancellationToken.None,
      new SavedDataStore(myStoredResponse)).Result;
     }

Il existe un exemple de projet attaché à ce tutoriel.

Pour utiliser jeton d'actualisation:

var init = new GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "OAuth_Client_ID_From_GoogleAPI",
        ClientSecret = "OAuth_Client_Secret"
    },
    Scopes = new string[] {"MY_SCOPES"}
};
var token = new TokenResponse { RefreshToken = "MY_REFRESH_TOKEN" };
var credential = new UserCredential(new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(init), "", token);

//init your Google API service, in this example Google Directory
var service = new DirectoryService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "",
});

Que faire si vous ne disposez pas d'un jeton d'actualisation?Le plus simple est de suivre les instructions sur Google SDK docs.Première télécharger vos informations d'identification à partir de l'API Google projet.Nom du fichier credentials.json.Ensuite, exécutez le code:

using (var stream =
    new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
{
    // The file token.json stores the user's access and refresh tokens, and is created
    // automatically when the authorization flow completes for the first time.
    string credPath = "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        Scopes,
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
    Console.WriteLine("Credential file saved to: " + credPath);
}

Cela devrait créer un dossier jeton.json et à l'intérieur de dossier est un autre fichier json qui a votre refresh_token.

{
    "access_token" : "asdf",
    "token_type" : "Bearer",
    "expires_in" : 3600,
    "refresh_token" : "XXX",
    "scope" : "https://www.googleapis.com/auth/admin.directory.user.readonly",
    "Issued" : "2019-02-08T12:37:06.157-08:00",
    "IssuedUtc" : "2019-02-08T20:37:06.157Z"
}

Je préfère ne pas utiliser le GoogleWebAuthorizationBroker parce que l'auto lance un navigateur web lors de l' le jeton n'est pas trouvé.Je préfère l'ancienne manière d'obtenir le jeton d'actualisation par un code d'accès.Ceci est très similaire à l'aide de Google OAuthUtil.CreateOAuth2AuthorizationUrl et OAuthUtil.GetAccessToken dans Google héritage de l'API OAuth.

var a = new Google.Apis.Auth.OAuth2.Flows.GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "asdf",
        ClientSecret = "hij"
    },
    Scopes = Scopes
};
var flow = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(a);
var url = flow.CreateAuthorizationCodeRequest(GoogleAuthConsts.InstalledAppRedirectUri).Build().AbsoluteUri;
Console.WriteLine("Go to this URL and get access code: " + url);

Console.Write("Enter access code: ");
var code = Console.ReadLine();

Console.WriteLine("Fetching token for code: _" + code + "_");
var r = flow.ExchangeCodeForTokenAsync("user", code, GoogleAuthConsts.InstalledAppRedirectUri, CancellationToken.None).Result;
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(r));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top