71793
C#・dot net core 3.1です。

GmailAPIを使ってメールクライアントのように、

  1. アカウント追加ボタンを押す
  2. Googleログイン画面が開く
  3. 権限を許可
  4. 以後は許可を促すプロンプトを出さずに使用できる

の流れを作りたいのですが、方法がわかりません。

GoogleのAPI管理サイト（GoogleCloudPlatform）でOauth2認証情報を作成し、Jsonをダウンロードしました。  
そのJsonをつかって以下のようにOauth2認証でTokenを取得できました。Tokenを保存した以後は許可を促すプロンプトは表示されずに使えました。

```

            static string[] Scopes = { GmailService.Scope.GmailReadonly};
            static string OAuthCredentialFilePath = "Credentials/credentials.json";
    
            private static async Task OAuth2Auth()
            {
                UserCredential credential;
    
                using (var stream =
                    new FileStream(OAuthCredentialFilePath, FileMode.Open, FileAccess.Read))
                {
                    string credPath = "token.json";
                    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        Scopes,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(credPath, true));
                }
    
                var service = new GmailService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential
                });
            }
    
```

おそらくメールクライアントのようにGmailアカウントを新たに追加するというのは、ユーザーにGoogleアカウントでログインさせて新たにTokenを取得して保存するということだと思います。  
しかし、この場合だと新たに認証することができません。

メールクライアントのようにアカウントを追加していくフローを実現するにはどうしたら良いでしょうか。  
よろしくおねがいします。
CC BY-SA 4.0
2020-11-07T15:45:03.033
71789
2020-11-08T03:27:54.600
32911
question
c# google-api gmail .net-core
Gmail APIでGmailクライアントを作るときの認証方法
みなさんありがとうございます。  
複数アカウントを追加していくことはできました。  
GoogleからOAuth2で使用するjsonをダウンロードする際にはもちろんGoogleアカウントが必要ですが、私はそのアカウントでダウンロードしたJsonファイルではそのアカウントでしか使用できないと勘違いしていました。

```

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

`GoogleWebAuthorizationBroker.AuthorizeAsync`というメソッドのuserという引数を変えると、新しい認可画面が表示されました。  
これで違うアカウントでログインしてスコープを許可すれば、`FileDataStore`でしていしたディレクトリにアクセストークンが保存され、以後user引数に渡したユーザー名でトークン保存先のディレクトリを見に行ってくれるようです。
CC BY-SA 4.0
2020-11-08T03:27:54.600
71793
2020-11-08T03:27:54.600
32911
71789
answer