Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 谷歌登录:后端验证_Node.js_Dart_Flutter_Google Oauth - Fatal编程技术网

Node.js 谷歌登录:后端验证

Node.js 谷歌登录:后端验证,node.js,dart,flutter,google-oauth,Node.js,Dart,Flutter,Google Oauth,我让谷歌登录我的应用程序:相关代码大致如下: var acc = await signInService.signIn(); var auth = await acc.authentication; var token = auth.idToken; let creds = require('./google-services.json'); let auth = require('google-auth-library').OAuth2Client; let client = new aut

我让谷歌登录我的应用程序:相关代码大致如下:

var acc = await signInService.signIn();
var auth = await acc.authentication;
var token = auth.idToken;
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();
这给了我一个很好的长令牌,然后通过HTTP POST将其传递到后端(这很好),然后尝试验证。我在颤振树和后端服务器(nodejs/restify)上都有相同的google-services.json文件。后端代码大致如下:

var acc = await signInService.signIn();
var auth = await acc.authentication;
var token = auth.idToken;
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();
这会始终返回错误“错误的收件人,有效负载观众!=requiredAudience”


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

这里的问题是用于创建OAuth2Client的
客户端id
,而
验证idToken
中用作
受众的
客户端id
是相同的。
受众的
客户端id
应该是前端应用程序中用于获取
id\u令牌的
客户端id

下面是谷歌文档中的示例代码

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);
下面是文档的详细信息

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);

希望这能有所帮助。

我已经让代码正常工作了——我的google-services.json文件中的oauth_客户端数组有三个条目,结果证明其中一个可以正常工作。我仍然想知道这一个有什么特别之处,为什么其他人没有。我目前正与同样的问题作斗争。我使用与您相同的代码(第二个代码段)来验证id标记。您提到json中有多个客户端ID。就我而言,我只有一个。我正在开发一个web应用程序,在使用Google登录登录后,我希望从前端获得令牌。你知道我漏掉了什么吗?我错的原因是我忘了在我的客户ID后面加上.apps.googleusercontent.com,我只是把它的随机字符串部分加进去了。