2017-01-18 1 views
0

Я работаю над инструментом, который я буду использовать позже для управления подписями пользователей в моей организации, мне удалось сделать все приложение, и я узнал об этом во время тестирования я могу только изменить свою подпись ...Я не могу изменить подпись других пользователей после аутентификации с помощью Google

Я считаю, что проблема связана с разрешениями и разрешением. Я использую идентификатор клиента OAuth, и я создал проект на console.developers.google.com, и я включил API Gmail.

Ниже важная часть моего кода:

public async void btnAuthorize_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      updateOutput("Trying to authorize with Google", "I"); 
      using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) 
      { 
       credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, 
        new[] { GmailService.Scope.GmailSettingsBasic }, "user" 
        , CancellationToken.None, new FileDataStore("Gmail.Signature")); 
      } 
      updateOutput("Authorized successfully", "I"); 
      btnUpdateSignature.Enabled = true; 
     } 
     catch (Google.GoogleApiException ex) 
     { 
      updateOutput(ex.Message, "E"); 
     } 
    } 

    private void btnUpdateSignature_Click(object sender, EventArgs e) 
    { 
     // reading the users list one by one 
     // reading the signature text 
     // replacing the place holders with actual values 
     // upload the real signature text 
     // Create the service. 
     string signatureLocal = ""; 
     string[] dataFields; 
     string userEmail; 
     int position=0; 
     string stat = ""; 
     try 
     { 
      if (csvData_Arr.Length > 0) 
      { 
       foreach (string line in csvData_Arr) 
       { 
        if (position==0) 
        { 
         // skip this step, this is the header 
         position++; 
        } 
        else 
        { 
         dataFields = line.Split(','); 
         userEmail = dataFields[0]; 
         signatureLocal = mapSignatureFields(signatureText, dataFields); 
         updateOutput("Updating signature for: " + userEmail, "I"); 
         stat = updateSignature(userEmail, signatureLocal); 
         updateOutput(stat, "D"); 
         if (chkGetbackSig.Checked == true) 
         { 
          updateOutput("Final signature: " + signatureLocal, "I"); 
         } 
         position++; 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      updateOutput(ex.Message, "E"); 
     } 
    } 

    private string updateSignature(string emailID, string signatureText) 
    { 
     SendAs sendAsObj = new SendAs(); 
     service = new GmailService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Gmail API - Signature Manager", 
     }); 

     try 
     { 
      sendAsObj.SendAsEmail = emailID; 
      sendAsObj.Signature = signatureText; 
      service.Users.Settings.SendAs.Patch(sendAsObj, emailID, emailID).Execute(); 
      UsersResource.SettingsResource.SendAsResource.GetRequest sendAsRes = service.Users.Settings.SendAs.Get(emailID, emailID); 
      if (chkGetbackSig.Checked==true) 
      { 
       return sendAsRes.Execute().Signature.ToString(); 
      } 
      return ""; 
     } 
     catch (Google.GoogleApiException ex) 
     { 
      return ex.Message; 
     } 
    } 

При выполнении приложения, оно может успешно обновить свою подпись, но когда дело доходит до других пользователей, он возвращает:

Google.Apis.Requests.RequestError Invalid user id specified in request/Delegation denied [403] Errors [ Message[Invalid user id specified in request/Delegation denied] Location[ - ] Reason[forbidden] Domain[global] ]

Я немного потерял и смутил, где и как мне заставить его работать с другими пользователями. Учетная запись, которую я использую при создании проекта, имеет права супер администратора для домена.

Цените вашу помощь

Edit 1: Я попытался с помощью учетной записи службы, но я сделал это неправильно, кажется:

private async void button1_Click(object sender, EventArgs e) 
    { 
     string signatureLocal = ""; 
     string[] dataFields; 
     string userEmail; 
     int position = 0; 
     string stat = ""; 
     string certPath=appPath + "saKey.p12"; 
     var cert = new X509Certificate2(certPath, "notasecret", X509KeyStorageFlags.Exportable); 
     string[] scopes = new string[] {GmailService.Scope.GmailSettingsBasic}; 
     try 
     { 
      updateOutput("Trying to authorize with Google", "I"); 
      ServiceAccountCredential cred = new ServiceAccountCredential(
       new ServiceAccountCredential.Initializer("[email protected]") 
       { 
        Scopes = scopes 
       }.FromCertificate(cert)); 

      serviceSA = new GmailService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = cred, 
       ApplicationName = "Gmail API - Signature Manager", 
      }); 

      updateOutput("Authorized successfully", "I"); 

      SendAs sendAsObj = new SendAs(); 
      foreach (string line in csvData_Arr) 
      { 
       if (position == 0) 
       { 
        // skip this step, this is the header 
        position++; 
       } 
       else 
       { 
        dataFields = line.Split(','); 
        userEmail = dataFields[0]; 
        signatureLocal = mapSignatureFields(signatureText, dataFields); 
        updateOutput("Updating signature for: " + userEmail, "I"); 

        sendAsObj.SendAsEmail = userEmail; 
        sendAsObj.Signature = signatureLocal; 
        serviceSA.Users.Settings.SendAs.Patch(sendAsObj, userEmail, userEmail).Execute(); 
        UsersResource.SettingsResource.SendAsResource.GetRequest sendAsRes = serviceSA.Users.Settings.SendAs.Get(userEmail, userEmail); 
        if (chkGetbackSig.Checked == true) 
        { 
         updateOutput(sendAsRes.Execute().Signature.ToString(), "D"); 
        } 

        updateOutput(stat, "D"); 
        if (chkGetbackSig.Checked == true) 
        { 
         updateOutput("Final signature: " + signatureLocal, "I"); 
        } 
        position++; 
       } 
      } 


     } 
     catch (Google.GoogleApiException ex) 
     { 
      updateOutput(ex.Message, "E"); 
     } 
    } 
+0

есть ли у других пользователей аутентификация приложения? – DaImTo

+0

Нет, это должно быть серверной стороной, и мы не хотим, чтобы пользователи имели влияние на подписи и как мы контролируем их ... – Bluescrod

+0

Вы считали, что собираетесь с учетной записью службы? – DaImTo

ответ

0

Я пришел рабочий код:

private async void button1_Click(object sender, EventArgs e) 
    { 
     string signatureLocal = ""; 
     string[] dataFields; 
     string userEmail; 
     int position = 0; 
     string stat = ""; 
     string certPath=appPath + "saKey.p12"; 
     var cert = new X509Certificate2(certPath, "notasecret", X509KeyStorageFlags.Exportable); 
     string[] scopes = new string[] {GmailService.Scope.GmailSettingsBasic, GmailService.Scope.MailGoogleCom}; 
     try 
     { 


      SendAs sendAsObj = new SendAs(); 
      foreach (string line in csvData_Arr) 
      { 
       if (position == 0) 
       { 
        // skip this step, this is the header 
        position++; 
       } 
       else 
       { 
        dataFields = line.Split(','); 
        userEmail = dataFields[0]; 

        updateOutput("Trying to authorize with Google", "I"); 
        ServiceAccountCredential cred = new ServiceAccountCredential(
         new ServiceAccountCredential.Initializer("[email protected]") 
         { 
          User = userEmail, 
          Scopes = scopes 
         }.FromCertificate(cert)); 


        updateOutput("Authorized successfully", "I"); 

        serviceSA = new GmailService(new BaseClientService.Initializer() 
        { 
         HttpClientInitializer = cred, 
         ApplicationName = "Gmail API - Signature Manager", 
        }); 

        signatureLocal = mapSignatureFields(signatureText, dataFields); 
        updateOutput("Updating signature for: " + userEmail, "I"); 

        sendAsObj.SendAsEmail = userEmail; 
        sendAsObj.Signature = signatureLocal; 
        serviceSA.Users.Settings.SendAs.Patch(sendAsObj, userEmail, userEmail).Execute(); 
        UsersResource.SettingsResource.SendAsResource.GetRequest sendAsRes = serviceSA.Users.Settings.SendAs.Get(userEmail, userEmail); 
        if (chkGetbackSig.Checked == true) 
        { 
         updateOutput(sendAsRes.Execute().Signature.ToString(), "D"); 
        } 

        updateOutput(stat, "D"); 
        if (chkGetbackSig.Checked == true) 
        { 
         updateOutput("Final signature: " + signatureLocal, "I"); 
        } 
        position++; 
       } 
      } 


     } 
     catch (Google.GoogleApiException ex) 
     { 
      updateOutput(ex.Message, "E"); 
     } 
    } 

One вопрос здесь, это нормально, если я повторно аутентифицируюсь для каждой итерации, которую у меня есть? Я мог бы получить 1000 счетов для аутентификации на каждую секунду ...

Спасибо!

+1

Клиентская библиотека собирается повторно запрашивать аутентификацию, если она ему нужна. Не должно быть проблемой. Api, вероятно, будет возражать против того, чтобы вы бежали так быстро. – DaImTo

+0

Я пробую этот код (с учетными данными ServiceAccount), но он не работает. Он генерирует исключение: serviceSA.Users.Settings.SendAs.Patch (sendAsObj, userEmail, userEmail) .Execute(); с ошибкой. Google.Apis.Auth.OAuth2.Responses.TokenResponseException: «Ошибка:« unauthorized_client », Описание:« Клиент неавторизован для получения токенов доступа с помощью этого метода ». Uri:« «» все еще работает в вашем случае? – pinguinone

Смежные вопросы