0

我正在尝试在 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 令牌。我将尝试找出如何验证访问令牌等等。

4

1 回答 1

0

如果您要在后端服务器上验证访问令牌(从 chrome.identity 返回的内容),请使用以下代码:

const { OAuth2Client } = require('google-auth-library');
const authClient = new OAuth2Client(CLIENT_ID, CLIENT_SECRET);

authClient.getTokenInfo(token)

如果 authClient.getTokenInfo(token) 出错,则令牌无效。

于 2019-05-18T22:12:11.297 回答