Получите id_token с помощью Chrome Identity API

Я разрабатываю расширение Google Chrome, чтобы пользователи могли аутентифицироваться с помощью своих учетных записей Google, я решил использовать Chrome Identity API.

Чтобы аутентифицировать пользователя в моем приложении, мне нужно получить ID_Token (подписанный токен)

Есть ли способ получить токен OpenID Connect с помощью Google Chrome Identity API?

Спасибо за вашу помощь !


person user2602584    schedule 01.07.2015    source источник
comment
Вы читали документацию: developer.chrome.com/apps/identity? Кроме того, посмотрите на пример или два, например здесь: github .com/GoogleChrome/chrome-app-samples/tree/master/samples/   -  person Brian    schedule 01.07.2015
comment
@ Брайан, да, я уже прочитал это и сделал то же самое, пока все работает нормально! но результатом является токен доступа, который служит только для доступа к ресурсам Google API, таким как (Диск, Календарь, ...), в моем случае мне нужно использовать идентификатор пользователя Google для его аутентификации в мое приложение. Единственным способом является токен OpenID Connect: это особый вид токена, который содержит всю информацию о пользователе и является подписанным токеном. взгляните на это: developers.google.com/identity/protocols/OpenIDConnect Спасибо за ваше переиграть !   -  person user2602584    schedule 01.07.2015
comment
Вам недостаточно токена от getProfileUserInfo?   -  person Xan    schedule 01.07.2015
comment
Взгляните на это: developers.google.com/identity/protocols/OpenIDConnect.   -  person Xan    schedule 01.07.2015
comment
@Xan Да, я работал с OpenID Connect в других моих веб-приложениях (на стороне сервера), это очень полезно, но для расширений Chrome это не работает! я пытаюсь получить идентификатор пользователя Google с помощью getProfileUserInfo, для этого требуется определенная область?   -  person user2602584    schedule 01.07.2015
comment
Что вы подразумеваете под не работает? И нет, вам не нужны никакие области видимости для getProfileUserInfo.   -  person Xan    schedule 01.07.2015
comment
Да, посмотрите на это: stackoverflow. ком/вопросы/27990787/   -  person user2602584    schedule 01.07.2015
comment
меня тоже это интересует. обратите внимание, что вы можете получить адрес электронной почты пользователя с помощью oauth, но это не то же самое, что openid.   -  person Zig Mandel    schedule 01.07.2015
comment
@ZigMandel да, нам нужно больше, чем электронная почта и время опыта, особенно подпись!   -  person user2602584    schedule 01.07.2015


Ответы (1)


Это вставка моего ответа из другой темы https://stackoverflow.com/a/32548057/3065313

Вчера я столкнулся с той же проблемой, и, поскольку я нашел решение, я мог бы поделиться им, так как это было не так очевидно. Насколько я знаю, Google не предоставляет прямого и документированного способа сделать это, но вы можете использовать функцию chrome.identity.launchWebAuthFlow().

Сначала вы должны создать учетные данные веб-приложения в консоли Google и добавить следующий URL-адрес в качестве действительного Authorized redirect URI: https://<EXTENSION_OR_APP_ID>.chromiumapp.org. URI не обязательно должен существовать, chrome просто поймает перенаправление на этот URL-адрес и позже вызовет вашу функцию обратного вызова.

manifest.json:

{
  "manifest_version": 2,
  "name": "name",
  "description": "description",
  "version": "0.0.0.1",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions": [
    "identity"
  ],
  "oauth2": {
    "client_id": "<CLIENT_ID>.apps.googleusercontent.com",
    "scopes": [
      "openid", "email", "profile"
    ]
  }
}

background.js:

// Using chrome.identity
var manifest = chrome.runtime.getManifest();

var clientId = encodeURIComponent(manifest.oauth2.client_id);
var scopes = encodeURIComponent(manifest.oauth2.scopes.join(' '));
var redirectUri = encodeURIComponent('https://' + chrome.runtime.id + '.chromiumapp.org');

var url = 'https://accounts.google.com/o/oauth2/auth' + 
          '?client_id=' + clientId + 
          '&response_type=id_token' + 
          '&access_type=offline' + 
          '&redirect_uri=' + redirectUri + 
          '&scope=' + scopes;

chrome.identity.launchWebAuthFlow(
    {
        'url': url, 
        'interactive':true
    }, 
    function(redirectedTo) {
        if (chrome.runtime.lastError) {
            // Example: Authorization page could not be loaded.
            console.log(chrome.runtime.lastError.message);
        }
        else {
            var response = redirectedTo.split('#', 2)[1];

            // Example: id_token=<YOUR_BELOVED_ID_TOKEN>&authuser=0&hd=<SOME.DOMAIN.PL>&session_state=<SESSION_SATE>&prompt=<PROMPT>
            console.log(response);
        }
    }
);

Документацию по API Google OAuth2 (для OpenID Connect) можно найти здесь: https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters

PS: Если вам не нужен раздел oauth2 в вашем манифесте. Вы можете смело опустить его и предоставить идентификаторы и области видимости только в коде.

РЕДАКТИРОВАТЬ: Для тех, кто заинтересован, вам не нужен API идентификации. Вы даже можете получить доступ к токену, используя небольшой трюк с API вкладок. Код немного длиннее, но у вас лучше сообщения об ошибках и управление. Помните, что в следующем примере вам необходимо создать учетные данные Chrome App.

manifest.json:

{
  "manifest_version": 2,
  "name": "name",
  "description": "description",
  "version": "0.0.0.1",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions": [
    "tabs"
  ],
  "oauth2": {
    "client_id": "<CLIENT_ID>.apps.googleusercontent.com",
    "scopes": [
      "openid", "email", "profile"
    ]
  }
}

background.js:

// Using chrome.tabs
var manifest = chrome.runtime.getManifest();

var clientId = encodeURIComponent(manifest.oauth2.client_id);
var scopes = encodeURIComponent(manifest.oauth2.scopes.join(' '));
var redirectUri = encodeURIComponent('urn:ietf:wg:oauth:2.0:oob:auto');

var url = 'https://accounts.google.com/o/oauth2/auth' + 
          '?client_id=' + clientId + 
          '&response_type=id_token' + 
          '&access_type=offline' + 
          '&redirect_uri=' + redirectUri + 
          '&scope=' + scopes;

var RESULT_PREFIX = ['Success', 'Denied', 'Error'];
chrome.tabs.create({'url': 'about:blank'}, function(authenticationTab) {
    chrome.tabs.onUpdated.addListener(function googleAuthorizationHook(tabId, changeInfo, tab) {
        if (tabId === authenticationTab.id) {
            var titleParts = tab.title.split(' ', 2);

            var result = titleParts[0];
            if (titleParts.length == 2 && RESULT_PREFIX.indexOf(result) >= 0) {
                chrome.tabs.onUpdated.removeListener(googleAuthorizationHook);
                chrome.tabs.remove(tabId);

                var response = titleParts[1];
                switch (result) {
                    case 'Success':
                        // Example: id_token=<YOUR_BELOVED_ID_TOKEN>&authuser=0&hd=<SOME.DOMAIN.PL>&session_state=<SESSION_SATE>&prompt=<PROMPT>
                        console.log(response);
                    break;
                    case 'Denied':
                        // Example: error_subtype=access_denied&error=immediate_failed
                        console.log(response);
                    break;
                    case 'Error':
                        // Example: 400 (OAuth2 Error)!!1
                        console.log(response);
                    break;
                }
            }
        }
    });

    chrome.tabs.update(authenticationTab.id, {'url': url});
});
person Piotr Sobiech    schedule 13.09.2015
comment
привет @piotr, я столкнулся с той же проблемой, что и с API идентификации. для параметров итерации установлено значение true, но я не могу получить токен доступа. - person Amerrnath; 30.09.2015
comment
@Amerrnath, ты пытался сделать все так, как здесь написано? Возможно, вы пытаетесь получить доступ к API идентификации из сценария содержимого, он доступен только в фоновых сценариях. Также проверьте авторизованные URI перенаправления, так как это очень важный шаг. Помните, что ‹CLIENT_ID› меняется при локальной установке расширения. К сожалению, мне нужно больше информации, чтобы помочь вам. - person Piotr Sobiech; 01.10.2015
comment
stackoverflow.com/questions/32852920/ . Я разместил свои шаги здесь, вы можете проверить это. и какой будет URI перенаправления для расширения Chrome. Благодарю. - person Amerrnath; 05.10.2015
comment
Почему я должен указывать как веб-приложение, а не приложение Chrome - person Amerrnath; 07.10.2015
comment
При настройке launchWebAuthFlow не возвращается access_token. Есть ли способ получить как access_token, так и id_token? - person dave; 21.02.2016
comment
это не работает, домен xxx.chromeapp.org не может быть добавлен в список авторизованных доменов, так как он не является основным доменом. В результате xxx.chromeapp.org не может быть допустимым URL перенаправления. - person Chen; 21.03.2019