1

Also verwende ich Google.Apis.Drive.v3 auf C#. In diesem Code ersuche ich um Zugriff auf das Laufwerk des Benutzers.Google Drive API, wie zu wissen, wenn bereits authentifiziert?

UserCredential credential; 
    try 
    { 
     using (var stream = 
      new System.IO.FileStream ("client_secret.json", System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
     { 
      string credPath = System.Environment.GetFolderPath(
       System.Environment.SpecialFolder.Personal); 
      credPath = System.IO.Path.Combine (credPath, ".credentials/drive-hourcounter.json"); 

      credential = GoogleWebAuthorizationBroker.AuthorizeAsync (
       GoogleClientSecrets.Load (stream).Secrets, 
       Scopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore (credPath, true)).Result; 
     } 
    } 

Meine Frage ist, woher weiß ich, ob der Benutzer mir bereits Zugriff gewährt hat? Jetzt führe ich immer diesen Code aus, und wenn keine Ausnahmen ausgelöst werden, weiß ich, dass ich Zugriff habe. Gibt es eine bessere Lösung? Vielleicht testen Sie die Existenz der Datei ".credentials/drive-hourcounter.json" ??

Antwort

1

soweit ich verstehe, wenn Ihre Code-Ausführung erfolgreich die unten durchlaufen und ein Ergebnis erhalten, dann war die Autorisierung erfolgreich.

GoogleWebAuthorizationBroker.AuthorizeAsync(...).Result;

Die oben wird auf unbestimmte Zeit warten, wenn der Benutzer entweder die Tasten Zulassen oder Verweigern auf der Webseite klicken nicht auf, wenn Sie dazu aufgefordert. Das Abfangen der Ausnahme mit einem try-catch-Block ist eine übliche Methode, um die Verweigerung und andere unerwartete Fehler zu beheben (z. B. Fehler beim Herstellen einer Verbindung zur Google-Website)

Wenn Sie AuthorizeAsync auf erweiterte Weise behandeln müssen, können Sie möchte in Ihrem Code eine "async Task" -Struktur verwenden. Siehe: https://www.infoq.com/articles/Tasks-Async-Await


Prüfung der Existenz des „.credentials/drive-hourcounter.json“ Datei ist definitiv kein guter Ansatz wie der Zugang kann die lokale Datei zu löschen, ohne auf https://security.google.com/settings/security/permissions durch den Benutzer widerrufen werden.

+0

GoogleWebAuthorizationBroker.AuthorizeAsync bestanden wird(), selbst geleitet wird, wenn der Zugriff durch den Benutzer widerrufen, aber es wird Ausnahme auslösen, wenn Service api Aufruf – KevinBui

1

Sie müssen wirklich nicht wissen, ob der Benutzer Ihnen Zugriff gewährt hat, die Client-Bibliothek übergibt Ihnen all das.

Wenn der Benutzer keinen Zugriff hat, wird FileDatastore den Authentifizierungsbildschirm öffnen und sie danach fragen. FileDatastore speichert dann eine Datei auf Ihrem Computer mit den von Ihrer Anwendung benötigten Zugangsdaten, um beim nächsten Mal Zugang zu erhalten, ohne sie fragen zu müssen. Wenn die Datei nicht existiert, weiß sie, dass sie den Zugriff anfordern muss. "user" wird verwendet, um zwischen mehreren Benutzern zu unterscheiden.

Ich habe ein Tutorial, das erklärt, wie FileDatastor in Bezug auf dem Client-Bibliothek Google .net – FileDatastore demystified

Dies ist die Methode, die ich verwende .net Google funktionieren. Es ist etwas anders als deins, aber nicht viel.

/// <summary> 
/// 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> 
/// <returns>DriveService used to make requests against the Drive API</returns> 
public static DriveService AuthenticateOauth(string clientSecretJson, string userName) { 
try { 
    if (string.IsNullOrEmpty(userName)) 
    throw new Exception("userName is required."); 
    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 
    string[] scopes = new string[] { 
    DriveService.Scope.Drive 
    }; // View and manage the files in your Google Drive 

    UserCredential credential; 
    using(var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read)) { 
    string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
    credPath = Path.Combine(credPath, ".credentials/apiName"); 

    // Requesting Authentication or loading previously stored authentication for userName 
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, 
    scopes, 
    userName, 
    CancellationToken.None, 
    new FileDataStore(credPath, true)).Result; 
    } 

    // Create Drive API service. 
    return new DriveService(new BaseClientService.Initializer() { 
    HttpClientInitializer = credential, 
    ApplicationName = string.Format("{0} Authentication", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name), 
    }); 
} catch (Exception ex) { 
    Console.WriteLine(string.Format("AuthenticateOauth failed: {0}", ex.Message)); 
    throw new Exception("RequestAuthentcationFailed", ex); 
} 
} 
1

Ihre App erhält die Autorisierung, wenn Benutzer Allows it in the consent screen.

  1. Wenn der Benutzer zustimmt, dann Google gibt Ihre Anwendung eine kurzlebigen Zugriffstoken.
  2. Ihre Anwendung fordert Benutzerdaten an und hängt das Zugriffstoken an die Anforderung an.
  3. Wenn Google feststellt, dass Ihre Anfrage und das Token gültig sind, werden die angeforderten Daten zurückgegeben.

Wenn Google die angeforderten Daten in Bezug auf Ihre scope zurückgibt, bedeutet, dass Sie dazu berechtigt sind. Wenn Sie jedoch eine Error 403 message erhalten, bedeutet dies, dass Sie keine Berechtigung haben.

0

Um zu überprüfen, ob Berechtigungsnachweis in lokalen

await new FileDataStore(credPath, true).GetAsync<TokenResponse>(userId) != null