gpt4 book ai didi

google-chrome-extension - 是否可以使用 Chrome App Indentity Api 获取 Id token ?

转载 作者:行者123 更新时间:2023-12-03 23:50:54 25 4
gpt4 key购买 nike

我无法从 Chrome 身份 api ( https://developers.google.com/accounts/docs/CrossClientAuth ) 获取用户的 id_token ( https://developer.chrome.com/apps/identity )。

当 list 中的 oauth 部分为:

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

但是,当我尝试以与在我的 android 客户端上获取它相同的方式获取 id_token 时,会出现错误:

“OAuth2 请求失败:服务响应错误:'无效范围:{0}'”}

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

在 Android 上,我通过将相同的范围字符串传递给 android.gms.auth.GoogleAuthUtil.getToken() 来获取 id_token,但我无法让它与 chrome 身份 api 一起使用。

是否可以使用 Chrome App Indentity Api 获得 id_token?如果没有,我怎样才能获得我的 Chrome 应用程序的 id_token?

谢谢你的帮助!

最佳答案

我昨天遇到了同样的问题,既然我找到了解决方案,我不妨分享一下,因为它并不那么明显。据我所知,Google 没有提供直接且有记录的方法来执行此操作,但您可以使用 chrome.identity.launchWebAuthFlow()功能。

首先你应该创建一个 网络应用 谷歌控制台中的凭据并将以下网址添加为有效的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"
]
}
}

背景.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:如果您不需要 list 中的 oauth2 部分。您可以放心地省略它,并仅在代码中提供标识符和范围。

编辑:
对于那些感兴趣的人,您不需要身份 API。您甚至可以使用 tabs API 的小技巧来访问 token 。代码有点长,但是你有更好的错误信息和控制。请记住,在以下示例中,您需要创建 Chrome 应用程序 证书。

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"
]
}
}

背景.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});
});

关于google-chrome-extension - 是否可以使用 Chrome App Indentity Api 获取 Id token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com