Я не могу изменить подпись других пользователей после аутентификации в Google

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

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

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

    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 Указан неверный идентификатор пользователя в запросе / Делегирование отклонено [403] Ошибки [Сообщение [Указан неверный идентификатор пользователя в запросе / отказано в делегировании] Местоположение [ - ] Причина [запрещен] Домен [глобальный] ]

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

Ценю твою помощь

Изменить 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("xxx@cool-monolith-153015.iam.gserviceaccount.com")
                {
                    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");
        }
    }

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, 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("xxx@cool-monolith-153015.iam.gserviceaccount.com")
                        {
                            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");
        }
    }

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

Спасибо!

Другие вопросы по тегам