代码之家  ›  专栏  ›  技术社区  ›  Daniel Cukier

google/dialogflow上的操作:从idtoken获取用户数据,不带conv对象

  •  0
  • Daniel Cukier  · 技术社区  · 7 年前

    我有一个已部署的操作,它启用了Google登录帐户链接。此操作使用云函数作为fullflment。我们使用以下方法从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?
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Prisoner    7 年前

    idtoken只是一个普通的 JWT (JSON Web Token) 这是由谷歌的一把钥匙签署的(它经常旋转)。虽然你 应该 验证签名,您不需要 需要 去。

    您可以使用任何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格式进行验证。

        2
  •  1
  •   Reza Nasiri    7 年前

    您可以使用“google auth library”来验证令牌并获取有效负载。这是到的链接 the documentation

    推荐文章