Вчера я столкнулся с той же проблемой, и, поскольку я нашел решение, я мог бы также поделиться им, поскольку это было не так очевидно. Насколько я знаю, 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});
});
Терминологии с OAuth является сумасшедшим. В вашем сообщении вы ссылаетесь на «идентификатор пользователя», «client_id», «id token» и «id». Можете ли вы точно сказать, что именно вы пытаетесь получить? (Я знаю несколько вещей о «client_id», «id» слишком общий для меня, чтобы понять, и я не уверен, что такое «идентификатор пользователя».) –
Согласитесь, есть несколько терминов, которые вам нужно сохранить отдельный. Отредактировал сообщение для ясности. Клиент_ид упоминается в первой ссылке в сообщении, необходимо указать аудиторию в id_token. Я думаю, что ясно, что мне нужен id_token, который можно проверить при добавлении https://www.googleapis.com/oauth2/v1/tokeninfo?id_token= – chris
Вы пытались добавить 'openid' в области? Обычно это необходимый совет, чтобы заставить сервер работать в режиме OpenID Connect и выдать идентификатор. –