尝试在后端 nodejs 服务器上验证时在 js chrome 扩展中生成令牌时出错
Error when generating a token in a js chrome extension when trying to verify it on a backend nodejs server
我正在尝试在 chrome 扩展中生成一个令牌,然后使用它来验证对后端服务器的请求。我已经成功地在前端生成了一个令牌,但是当我将它发送到后端并使用 nodejs 库验证它时 google-auth-library
但总是得到错误 Error: Wrong number of segments in token: [TOKEN_HERE]
.
我试图找出如何在线修复它,但我发现没有任何效果。我的扩展的ID和控制台的ID一样。
我在开发人员控制台中创建了一个 chrome 扩展应用程序并将其添加到我的清单中:
"oauth2": {
"client_id": "THE ID",
"scopes":["https://www.googleapis.com/auth/classroom.topics.readonly", "https://www.googleapis.com/auth/classroom.topics","https://www.googleapis.com/auth/classroom.courses.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly", "https://www.googleapis.com/auth/classroom.student-submissions.me.readonly"]
},
...
"permissions": [
"identity",
],
一旦我运行代码
chrome.identity.getAuthToken({interactive: true}, function(token) {
console.log(token);
});
它生成一个令牌,我能够在扩展中验证它:
var x = new XMLHttpRequest();
x.open('GET', 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' + token);
这还在我的控制台中生成了一个新的 oAuth2 客户端,它是一个 Web 应用程序:
https://i.imgur.com/uH789P8.png
在后端 nodejs 服务器上,我尝试使用两个生成的 ID 来验证令牌。扩展应用程序没有客户端密码,但 Web 应用程序有。我试过将秘密与网络服务器 ID 一起使用,但这也不起作用。
这是后端验证的代码:
const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID);
async function verify(token) {
const ticket = await authClient.verifyIdToken({
idToken: token,
audience: [CLIENT_ID] // Specify the CLIENT_ID of the app that accesses the backend
// Or, if multiple clients access the backend:
//[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
});
const payload = ticket.getPayload();
return {
domain: payload['hd'],
userid: payload['sub']
}
}
我想用此代码验证令牌,但无法验证。每次我使用可通过 xhr
请求验证的令牌时,它只会给我错误 Error: Wrong number of segments in token
。我不知道从这里去哪里,因为文档有点稀缺。感谢所有帮助!
编辑:我也尝试用 Bearer
前缀验证令牌,但它不起作用。
编辑 2:我找到问题了! ...只是不是解决方案。当我弄清楚时会更新。只是想让你知道它不起作用的原因是我尝试获取令牌的方式给了我一个访问令牌而不是 ID 令牌。我将尝试了解如何验证访问令牌等。
如果您希望在后端服务器上验证访问令牌(从 chrome.identity 返回的内容),请使用此代码:
const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID, CLIENT_SECRET);
authClient.getTokenInfo(token)
如果 authClient.getTokenInfo(token) 出错,则令牌无效。
我正在尝试在 chrome 扩展中生成一个令牌,然后使用它来验证对后端服务器的请求。我已经成功地在前端生成了一个令牌,但是当我将它发送到后端并使用 nodejs 库验证它时 google-auth-library
但总是得到错误 Error: Wrong number of segments in token: [TOKEN_HERE]
.
我试图找出如何在线修复它,但我发现没有任何效果。我的扩展的ID和控制台的ID一样。
我在开发人员控制台中创建了一个 chrome 扩展应用程序并将其添加到我的清单中:
"oauth2": {
"client_id": "THE ID",
"scopes":["https://www.googleapis.com/auth/classroom.topics.readonly", "https://www.googleapis.com/auth/classroom.topics","https://www.googleapis.com/auth/classroom.courses.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly", "https://www.googleapis.com/auth/classroom.student-submissions.me.readonly"]
},
...
"permissions": [
"identity",
],
一旦我运行代码
chrome.identity.getAuthToken({interactive: true}, function(token) {
console.log(token);
});
它生成一个令牌,我能够在扩展中验证它:
var x = new XMLHttpRequest();
x.open('GET', 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' + token);
这还在我的控制台中生成了一个新的 oAuth2 客户端,它是一个 Web 应用程序: https://i.imgur.com/uH789P8.png
在后端 nodejs 服务器上,我尝试使用两个生成的 ID 来验证令牌。扩展应用程序没有客户端密码,但 Web 应用程序有。我试过将秘密与网络服务器 ID 一起使用,但这也不起作用。
这是后端验证的代码:
const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID);
async function verify(token) {
const ticket = await authClient.verifyIdToken({
idToken: token,
audience: [CLIENT_ID] // Specify the CLIENT_ID of the app that accesses the backend
// Or, if multiple clients access the backend:
//[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
});
const payload = ticket.getPayload();
return {
domain: payload['hd'],
userid: payload['sub']
}
}
我想用此代码验证令牌,但无法验证。每次我使用可通过 xhr
请求验证的令牌时,它只会给我错误 Error: Wrong number of segments in token
。我不知道从这里去哪里,因为文档有点稀缺。感谢所有帮助!
编辑:我也尝试用 Bearer
前缀验证令牌,但它不起作用。
编辑 2:我找到问题了! ...只是不是解决方案。当我弄清楚时会更新。只是想让你知道它不起作用的原因是我尝试获取令牌的方式给了我一个访问令牌而不是 ID 令牌。我将尝试了解如何验证访问令牌等。
如果您希望在后端服务器上验证访问令牌(从 chrome.identity 返回的内容),请使用此代码:
const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID, CLIENT_SECRET);
authClient.getTokenInfo(token)
如果 authClient.getTokenInfo(token) 出错,则令牌无效。