Tôi đã gặp vấn đề tương tự hôm qua và vì tôi đã tìm được giải pháp, tôi cũng có thể chia sẻ nó, vì điều đó không rõ ràng. Theo tôi biết Google không cung cấp cách trực tiếp và tài liệu để thực hiện việc này, nhưng bạn có thể sử dụng chức năng chrome.identity.launchWebAuthFlow()
.
Trước tiên, bạn cần tạo ứng dụng web thông tin đăng nhập trong bảng điều khiển google và thêm url sau làm Authorized redirect URI
: https://<EXTENSION_OR_APP_ID>.chromiumapp.org
hợp lệ. URI không phải tồn tại, chrome sẽ chỉ chuyển hướng đến URL này và gọi hàm gọi lại của bạn sau.
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 (đối với OpenID Connect) tài liệu có thể được tìm thấy ở đây: https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters
PS : Nếu bạn không cần phần oauth2 trong tệp kê khai của mình. Bạn có thể bỏ qua nó một cách an toàn và chỉ cung cấp mã định danh và phạm vi trong mã.
EDIT: Đối với những người quan tâm, bạn không cần API danh tính. Bạn thậm chí có thể truy cập mã thông báo bằng cách sử dụng một mẹo nhỏ với API tab. Mã này dài hơn một chút, nhưng bạn có thông báo lỗi và kiểm soát tốt hơn. Xin lưu ý rằng trong ví dụ sau, bạn cần tạo Ứng dụng Chrome thông tin xác thực.
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});
});
Thuật ngữ với OAuth là điên. Trong bài đăng của bạn, bạn tham khảo "id người dùng", "client_id", "id token" và "id". Bạn có thể chính xác về chính xác những gì bạn đang cố gắng để có được? (Tôi biết một vài điều về "client_id", "id" quá chung chung đối với tôi để hiểu và tôi không chắc chắn "id người dùng" là gì.) –
Đồng ý, có một vài thuật ngữ bạn cần giữ tách rời. Đã chỉnh sửa bài đăng để rõ ràng. Client_id được đề cập trên liên kết đầu tiên trong bài đăng, cần phải chỉ định đối tượng trong id_token. Tôi nghĩ rõ ràng là tôi muốn một id_token có thể được xác minh khi được thêm vào https://www.googleapis.com/oauth2/v1/tokeninfo?id_token= – chris
Bạn đã thử thêm 'openid' vào phạm vi chưa? Đây thường là gợi ý bắt buộc để đưa máy chủ vào chế độ OpenID Connect và phát hành Mã thông báo ID. –