Google 登录:后端验证

Lee*_*ker 13 node.js dart google-oauth flutter

我在我的应用程序上使用了 Google Sign-in:相关代码大致如下:

var acc = await signInService.signIn();
var auth = await acc.authentication;
var token = auth.idToken;
Run Code Online (Sandbox Code Playgroud)

这给了我一个很好的长令牌,然后我使用 HTTP POST 将其传递给我的后端(这工作正常),然后尝试验证。我在我的颤振树和后端服务器(nodejs/restify)上有相同的 google-services.json 文件。后端代码大致如下:

let creds = require('./google-services.json');
let auth = require('google-auth-library').OAuth2Client;
let client = new auth(creds.client[0].oauth_client[0].client_id);
. . .
let ticket = await client.verifyIdToken({
    idToken: token,
    audience: creds.client[0].oauth_client[0].client_id
});
let payload = ticket.getPayload();
Run Code Online (Sandbox Code Playgroud)

这始终会返回我的错误“错误的收件人,有效负载受众!= requiredAudience”。

我也尝试过单独注册 GCP 控制台并使用这些键/client_id,但结果相同。我在哪里可以找到可以正确验证此令牌的有效 client_id?

小智 9

另一个快速解决方案可能是将参数“audience”的名称更改为“requiredAudience”。这对我有用。如果你从谷歌复制代码,也许谷歌文档已经过时了。

client.verifyIdToken({
      idToken,
      requiredAudience: GOOGLE_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]
  });
Run Code Online (Sandbox Code Playgroud)

  • 我没有找到任何 requiredAudience 参数。 (2认同)
  • 接口中不存在该参数 (2认同)

Sac*_*mar 8

这里的问题是client_id用于创建 OAuth2Client 的 和client_id用作audienceverifyIdToken是相同的。在client_idaudience应该是client_id这是在您的前端应用来获得id_token

以下是来自 Google 文档的示例代码。

const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(CLIENT_ID);
async function verify() {
  const ticket = await client.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();
  const userid = payload['sub'];
  // If request specified a G Suite domain:
  //const domain = payload['hd'];
}
verify().catch(console.error);
Run Code Online (Sandbox Code Playgroud)

这是文档的链接

希望这可以帮助。

  • 我对前端和后端使用了相同的“client_id”,如文档中所示,但仍然出现此错误。 (6认同)