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}` : '';
}
在我们的例子中,我们只想获取 userId
或 idToken
并检索用户信息。可能是这样的:
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 格式以进行验证。
我部署了一个启用了 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}` : '';
}
在我们的例子中,我们只想获取 userId
或 idToken
并检索用户信息。可能是这样的:
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 格式以进行验证。