我部署了一个启用了Google登录帐户链接的Action。此操作使用云函数作为fullfilment。我们使用以下方法从DialogFlow调用中提取用户:
function userFromRequest(request) {
return request.body.originalDetectIntentRequest.payload.user;
}
此函数返回以下用户数据:
{
"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?
idToken只是一个普通的JWT(JSON Web令牌(,它由谷歌的一个密钥(频繁轮换(签名。尽管应该验证签名,但不需要来验证。
您可以使用任何JWT库。由于它看起来像是在使用node.js,所以可以使用类似于jsonwebtoken包的东西来解码它,如下所示:
const jwt = require('jsonwebtoken');
// get the decoded payload ignoring signature, no secretOrPrivateKey needed
const decoded = jwt.decode(token);
但是,您实际上应该验证签名,因此您需要以有用的格式获取密钥。多声道库中执行此操作的部分使用来自谷歌的JWK版本的密钥,并将其转换为PEM格式进行验证。
您可以使用"googleauthlibrary"来验证令牌并获取有效负载。这是文档的链接