Google/DialogFlow 上的操作:从没有 conv 对象的 idToken 获取用户数据

Actions on Google / DialogFlow: get user data from idToken without conv object

我部署了一个启用了 Google 登录帐户链接的操作。此操作使用云功能作为实现。我们使用此方法从 DialogFlow 调用中提取用户:

function userFromRequest(request) {
  return request.body.originalDetectIntentRequest.payload.user;
}

这个函数returns这个用户数据:

   { 
     "idToken": "eyJhbGciOiJSU...",
     "lastSeen": "2018-11-29T16:58:22Z",
     "locale": "en-US",
     "userId": "ABwpp..."
   }

我的问题是:如何从 DialogFlow 应用外部 获取电子邮件、姓名等用户信息。

所有文档示例都有一个可用的 conv 对象:

app.intent('Default Welcome Intent', async (conv) => {
  const {payload} = conv.user.profile;
  const name = payload ? ` ${payload.given_name}` : '';
}

在我们的例子中,我们只想获取 userIdidToken 并检索用户信息。可能是这样的:

const dialogflow = require("actions-on-google");    
const app = dialogflow({clientId: '94661...@apps.googleusercontent.com'});

app.getUserData(idToken); //this does not exists, how to have something equivalent?

您可以使用"google-auth-library"验证令牌并获取负载。这是 link 到 the documentation

idToken 只是一个普通的 JWT (JSON Web Token),已由 Google 的密钥之一(轮换非常频繁)签名。虽然您应该验证签名,但您不需要

您可以使用任何 JWT 库。由于看起来您正在使用 node.js,因此您可以使用 jsonwebtoken 包之类的东西来解码它:

const jwt = require('jsonwebtoken');
// get the decoded payload ignoring signature, no secretOrPrivateKey needed
const decoded = jwt.decode(token);

确实 应该验证签名,但是,您需要以有用的格式获取密钥。 multivocal library 中执行此操作的部分使用来自 Google 的密钥的 JWK 版本并将它们转换为 PEM 格式以进行验证。