Получение токена аутентификации для вторичного идентификатора из расширения Google chrome с помощью OAuth 2.0 & Client ID

Я довольно новичок в разработке расширений chrome, более конкретно к части аутентификации пользователей в расширениях chrome. Я следую Идентификатор Пользователя пример из документов разработчика Google.

пример работает отлично. Я смог создать идентификатор клиента для приложения chrome, добавить область для api в моем случае Gmail api. И, наконец, получите токен Auth, добавив identityразрешение manifest.json следующим образом

"oauth2": {
    "client_id": "MY CLIENT ID",
    "scopes": [
      "https://www.googleapis.com/auth/gmail.readonly",
      "https://www.googleapis.com/auth/gmail.modify"
    ]
  }

и мой приложение.js-это content_script, который имеет следующий код.

chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
    /* With which i can use xhr requests to get data from gmail api */
      console.log('Access Token : '+token);
});

теперь этот токен, который я получаю, дает мне результат для пользователя, с которым я вошел в chrome. Значение позволяет сказать, что у меня есть UserA с адресом электронной почты user_a@gmail.com и я использовал этот журнал в браузере chrome.

вопрос

как получить связанные учетные записи или вторичные учетные записи. Например, скажем, пользователь B входит в Gmail из chrome браузер. Можно ли получить доступ к api gmail для этого конкретного пользователя, который в настоящее время вошел в систему ?

Я пробовал пару вещей ..

gapi.auth.authorize({
            'client_id': CLIENT_ID,
            'scope': SCOPES.join(' '),
            'immediate': true
          }, 
          function(authResult){//do something});

в приведенном выше сценарии идентификатор клиента и области извлекаются из manifest.json используя chrome.runtime.getManifest();.

  • этот метод использует клиент.js из Google api и использует переменную gapi.
  • в этом случае я получаю маркер доступа для пользователя, которого я создал идентификатор клиента , даже пользователь приложения chrome.
  • кроме того, когда я открываю режим инкогнито и получаю доступ к этому плагину, я получаю тот же токен доступа пользователей.

Дополнительная Информация

Я пробовал то же самое gapi.auth.authorize() использование идентификатора клиента Web OAuth 2. Он отлично работает. Я имею в виду, что всякий раз, когда эта авторизация выполняется, она извлекает текущие данные пользователя или запрашивает логин, где пользователь может войти и аутентифицироваться. Как мне достичь то же самое в расширении chrome.. Пожалуйста, дайте мне знать, если я что-то пропустил .

3 ответов


http://developer.streak.com/2014/10/how-to-use-gmail-api-in-chrome-extension.html

является полным решением, которое я недавно реализовал на фоновой странице для работы с gmail api.

content script вызывает всплывающее окно для авторизации с помощью сгенерированного url и простой конечной точки сервера для хранения маркера обновления.

$.oauthpopup = function (options) {
options.windowName = options.windowName || 'ConnectWithOAuth'; // should not include space for IE

var left = (screen.width / 2) - (800 / 2);
var top = (screen.height / 2) - (500 / 1.4);

options.windowOptions = options.windowOptions || 'location=0,status=0,width=800,height=500,left=' + left + ',top=' + top;
options.callback = options.callback || function () {
    window.location.reload();
};
var that = this;

debug('oauthpopup open separate _oauthWindow');
that._oauthWindow = window.open(options.path, options.windowName, options.windowOptions);
};

$.oauthpopup({
            path: 'https://accounts.google.com/o/oauth2/auth?' +
            'access_type=offline' +
            '&approval_prompt=force' +
            '&client_id=' + clientID +
            '&redirect_uri=' + callBackUrl +
            '&response_type=code' +
            '&scope=https://mail.google.com/ email profile' +
            '&state=' + login.timyoUUID +
            '&user_id=' + login.user_email,
            callback: function () {
                // do callback stuff
            },
        });

callBackUrl используется для хранения маркера обновления на сервере.

вот пример того, как я поставил доступ токен для каждого запроса к gapi

export function setTokenForGAPI(accessToken) {
return getGAPIClient()
    .then(() => {
        const isSameToken = (currentAccessToken === accessToken);
        const noToken = ((accessToken === undefined) || (accessToken === ''));
        if (isSameToken || noToken) return;

        gapi.auth.setToken({
            access_token: accessToken,
        });

        currentAccessToken = accessToken;
    })
    .catch(function (e) {
        console.log('error in setTokenForGAPI', e);
    });
}
export function getEmailsByThreadIds(accessToken, ids) {
    return setTokenForGAPI(accessToken)
        .then(groupedThreadDetailsRequests(ids))
        .then(processEmailDetailsResponse);
}

Как я закончил обработку, было это (резюме):

  1. в слое страницы при загрузке я отправляю сообщение вниз по стеку в фоновый слой.
  2. я использовал launchWebAuthFlow () для https://accounts.google.com/o/oauth2/auth чтобы получить access_token для учетной записи.
  3. Я сделал вызов AJAX https://www.googleapis.com/oauth2/v4/token Использование access_token для получения маркера обновления.

когда пользователь изменения учетной записи, которую они используют с помощью кнопки аватар в правом верхнем углу, этот процесс запускается снова, так как он инициируется onLoad для слоя страницы расширения.

вещи, опущенные в описании выше, - это кэширование и обработка ошибок, которые очень важны.


на данный момент,это невозможно с помощью поддерживаемых API в Google Chrome стабильный (версия 63). Однако в Dev-канале и, скорее всего, с будущим релизом, возможно следующее:

chrome.identity.getAccounts(function(accounts) {
    // accounts is a list of accounts.
    chrome.identity.getAuthToken({ 'interactive': true, 'account': accounts[0] }, function(token) {
        /* With which i can use xhr requests to get data from gmail api */
          console.log('Access Token : '+token);
    });
});

посмотреть документация getAccounts().


редактировать что-то может работа тем временем регистрируется для the onSigninChanged событие.