【问题标题】:Error when generating a token in a js chrome extension when trying to verify it on a backend nodejs server尝试在后端nodejs服务器上验证它时在js chrome扩展中生成令牌时出错
【发布时间】:2019-10-01 11:38:01
【问题描述】:

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

【问题讨论】:

  • 收到错误时,令牌是否以Bearer开头?
  • 我在有和没有Bearer的情况下都试过了

标签: javascript node.js google-chrome-extension google-oauth google-auth-library-nodejs


【解决方案1】:

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

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

authClient.getTokenInfo(token)

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

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 2018-01-09
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2016-10-20
    • 2011-07-08
    相关资源
    最近更新 更多