Получение статуса 401 при отправке электронной почты с помощью gmail api в расширении chrome

Я получаю необработанные данные, полученные из метода "get" Gmail API, и отправляю их с помощью метода "send" Gmail API.

'var url = 'https://www.googleapis.com/gmail/v1/users/me/messages/id?
     format=raw&alt=json&access_token=' + token;
 url = url.replace("id", emailId);
 var x = new XMLHttpRequest();
 x.open('GET', url , true);
 x.send();
 x.onload = function() {
     var jsonRes = JSON.parse(x.response);
     sendEmail(jsonRes.raw);
 }


function sendEmail(raw) {
    if (raw) {
        var request = new XMLHttpRequest();
        var url = 'https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json&access_token=' + token;
        params = "raw=" + raw;
        request.open('POST', url , true);
        request.setRequestHeader("Authorization", "Bearer " + token);
        request.setRequestHeader("Content-type", "application/json");
        request.send(params);
        request.onload = function() {
            if (200 === request.status) {
                alert("Email sent successfully");
        }
    }
}`

Я получаю статус 401.

Если я отправляю эти необработанные данные из самого Страница API, то они отправляются успешно. Следовательно, необработанные данные верны.

Я что-то упускаю при отправке электронного письма. Пожалуйста помоги!

token где-то определяется?

Tomasz Bubała 10.08.2018 14:43

Да, токен - это глобальная переменная.

Pallavi Goyal 10.08.2018 14:51

вы авторизуете в getEmail? Похоже, вы получили 401 (Неавторизовано), потому что вы не авторизовали

Tomasz Bubała 10.08.2018 15:18
0
3
465
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ошибка 401 означает «недопустимые учетные данные», скорее всего, потому, что срок действия вашего токена истек или он недействителен.

Обозреватель Google API и Библиотеки Google Javascript позаботятся о токене (как правило), но если вы вызываете конечные точки службы напрямую с помощью XMLHttpRequest(), вам придется управлять токеном самостоятельно.

Если вы хотите пойти по этому пути, вот детали, которые вам нужно реализовать: https://developers.google.com/identity/protocols/OAuth2

Вы можете попробовать что-то на "игровой площадке Oauth2": https://developers.google.com/oauthplayground/

Но меня беспокоит то, что когда токен работает для цели «получить», тогда тот же токен должен работать и для цели «отправить».

Pallavi Goyal 13.08.2018 06:15
Ответ принят как подходящий

Спасибо за все отзывы.

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

function sendEmail(raw) {
     if (raw) {
         var request = new XMLHttpRequest();
         var url = 'https://www.googleapis.com/gmail/v1/users/me/messages/send';
         var params = JSON.stringify({'raw': raw});
         request.open('POST', url , true);
         request.setRequestHeader("Authorization", "Bearer " + token);
         request.setRequestHeader("Content-type", "application/json");
         request.send(params);
         request.onload = function() {
             if (200 === request.status) {
                 alert("Email sent successfully");
             }
         }
    }
}

Я исправил две ошибки-
1. Токен был отправлен как в URL-адресе, так и в заголовке. Его следует отправлять только в заголовке. 2. Необработанный параметр был отправлен как String, но он должен быть отправлен как объект JSON.

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