7

Я не могу получить id_token пользователя (https://developers.google.com/accounts/docs/CrossClientAuth) с идентификатором Chrome api (https://developer.chrome.com/apps/identity).Возможно ли получить токен идентификатора с помощью App Appity App App Apity?

я могу получить access_token используя образец идентичности хрома, когда секция OAuth в манифесте:

"oauth2": { 
    "client_id": "<chrome-app-client-id>.apps.googleusercontent.com", 
    "scopes": ["https://www.googleapis.com/auth/plus.login"] 
} 

Но когда я пытаюсь получить id_token так же, как я получаю на моем андроиде клиенте, то получит ошибка:

"запрос OAuth2 не удалось: служба ответила с ошибкой: 'недопустимый объем: {0}'"}

манифеста раздел теперь:

"oauth2": { 
    "client_id": "<chrome-app-client-id>.apps.googleusercontent.com", 
    "scopes": ["audience:server:client_id:<app-engine-client-id>.apps.googleusercontent.com"] 
} 

На Android Я получаю id_token, передавая ту же строку области применения в android.gms.auth.GoogleAuthUtil.getToken(), но я не могу заставить ее работать с хром-идентификатором api.

Возможно ли получить идентификатор id_token с помощью App Appity App App Apity? Если нет, как я могу получить id_token для моего приложения Chrome?

Благодарим за помощь!

+0

Терминологии с OAuth является сумасшедшим. В вашем сообщении вы ссылаетесь на «идентификатор пользователя», «client_id», «id token» и «id». Можете ли вы точно сказать, что именно вы пытаетесь получить? (Я знаю несколько вещей о «client_id», «id» слишком общий для меня, чтобы понять, и я не уверен, что такое «идентификатор пользователя».) –

+0

Согласитесь, есть несколько терминов, которые вам нужно сохранить отдельный. Отредактировал сообщение для ясности. Клиент_ид упоминается в первой ссылке в сообщении, необходимо указать аудиторию в id_token. Я думаю, что ясно, что мне нужен id_token, который можно проверить при добавлении https://www.googleapis.com/oauth2/v1/tokeninfo?id_token= – chris

+0

Вы пытались добавить 'openid' в области? Обычно это необходимый совет, чтобы заставить сервер работать в режиме OpenID Connect и выдать идентификатор. –

ответ

-1

Во-первых, я предполагаю, что в вашем фрагменте manifest.json вы не имеете в виду, что ваш client_id буквально "<chrome-app-client-id>.apps.googleusercontent.com. Это должно быть что-то вроде 9414861317621.apps.googleusercontent.com - что-то, что вы получили от Консоли разработчика, или любого другого сайта Google, который вы использовали для регистрации приложения.

Предполагая, что вышесказанное в порядке, и у вас есть права client_id, и область действия справа, вы получаете то, что называется «токеном доступа OAuth2», с вызовом chrome.identity.getAuthToken. Поскольку вы не показываете нам какой-либо код JavaScript, я не могу сказать, это то, что вы делаете. Маркер доступа, который вы получаете, должен быть сохранен для последующего использования при вызове функции API. Например:

var access_token; 

chrome.identity.getAuthToken(
    { 
     'interactive': true 
    }, 
    function(token) { 
     access_token = token; 
     // do something if you like to indicate 
     // that the app is authorized 
    } 
); 

Затем, когда вы делаете вызов API, вы поставляете, что маркер доступа, например:

var url = 'https://www.googleapis.com/' + method; 
Ajax.ajaxSend(url, "json", 
    function (status, response) { 
     if (response && response.error && response.error.message) 
      errorCallback(response.error.message); 
     else if (status == 200) 
      successCallback(response); 
     else 
      errorCallback('Result code: ' + status); 
    }, 
    function (e) { 
     if (errorCallback) 
      errorCallback('Communication error'); 
    }, 
    { 
     Authorization: 'Bearer ' + access_token 
    } 
); 

Ajax.ajaxSend моя собственная функция:

var Ajax = (function() { 
    var api = { 
     ajaxSend: function (url, responseType, successCallback, errorCallback, headers) { 
      var req = new XMLHttpRequest(); 
      req.onload = function (e) { 
       successCallback(req.status, req.response); 
      }; 
      req.onerror = errorCallback; 
      req.responseType = responseType ? responseType : "text"; 
      req.open("get", url); 
      if (headers) 
       for (var v in headers) 
        req.setRequestHeader(v, headers[v]); 
      req.send(); 
     } 
    }; 
    return api; 
})(); 

Другой Неопределенные функции также являются тем, что вы ожидаете. Третий аргумент Ajax.ajaxSend - это заголовок, который нужно отправить. (Извините, у меня нет времени на разработку отдельного кода только для этого ответа.)

Надеюсь, что это полезно.

+1

Спасибо за помощь, но это не ответ на мой вопрос. В моем вопросе в строке 3 я говорю, что знаю, как получить access_token (я включил это, чтобы избежать ответов, объясняющих, как их получить). То, что я пытаюсь получить, - id_token (токен, который может быть подтвержден при добавлении к этому URL-адресу: «googleapis.com/oauth2/v1/tokeninfo?id_token=») – chris

+0

Вы когда-нибудь это выясняли? Я также пытаюсь сделать то же самое. Благодарю. – rsb

+0

все еще борется с этим:/ – kidCoder

5

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

Сначала вы должны создать веб-приложение учетные данные в Google консоли и добавьте следующий URL-адрес в качестве действительного Authorized redirect URI: https://<EXTENSION_OR_APP_ID>.chromiumapp.org. URI не должен существовать, хром просто перехватит перенаправление этого 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); 
     } 
    } 
); 

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

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

EDIT: Для желающих вам не нужен 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}); 
}); 
+0

Hi Piotr. Я пробовал ваше решение, но я получаю * Ошибка авторизации на странице * Ошибка. Я делаю именно то, что вы делаете, с теми же областями в манифесте. –

+0

Привет @Aegidius, вы поняли это? У меня такая же проблема. Благодарю. – rsb

+0

@Aegidius, то же самое здесь, не уверен, что этот метод все еще действителен? – seesoe