Dialogflow Webhook V2帐户链接无法获取用户个人资料信息

时间:2018-09-28 12:30:42

标签: dialogflow actions-on-google

我已经成功使用Google sdk和Dialogflow上的操作在Android上进行了帐户关联,但是无法使用新的Dialogflow V2网络钩子使它正常工作。 它的确要求链接帐户的权限,并且确实发生了帐户链接,但是我无法访问用户数据,如given_name,email等。 我已经完成了所有必要的工作,包括使用actions_intent_SIGN_IN创建意图,该意图会按预期方式被调用,只是我没有得到应有的信息。

这是用于创建登录名的代码

function googleSignIn() {
    console.log('In googleSignIn')
    const conv = agent.conv()
    // conv.ask(new SignIn('To get your account details'))
    // conv.ask('Hello')

    var payload = {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.SIGN_IN",
        "data": {}
      }
    }

    // agent.add(payload)
    console.log('add googleSignIn payload')
    agent.add('Placeholder_google_payload')
    agent.add(new Payload(agent.ACTIONS_ON_GOOGLE, payload))
  }

当Google的“动作”触发意图时,就会调用此方法

function getSignIn(agent) {
    console.log('In function getSignin: ')
    const conv = agent.conv()
    console.log('conv parts: ', JSON.stringify(conv.user))
    agent.add('User profile:', conv.user);
    // console.log('conv access token: ', JSON.stringify(conv.user.access.token))
  }

在囚犯的帮助下,我设法解决了这个问题。基本上,您只需要获得必须解码的令牌即可。这是相关的代码。

var jwt = require('jsonwebtoken'); // use npm i jsonwebtoken to get 
const profile = jwt.decode(conv.user.profile.token);
console.log('Profile: ', profile); 
// you can then get the elements from the profile (instead of payload)
// e.g.
console.log('Name: ', profile.name);

1 个答案:

答案 0 :(得分:2)

一旦用户使用Google登录助手进行一次登录,所有其他请求将包含一个id令牌。

如果您使用的是Google行动库,则令牌将在conv对象中以conv.user.profile.id的形式出现,并且个人资料信息本身(ID令牌的“有效载荷”)将为在conv.user.profile.payload中。

如果您使用的是dialogflow-fulfillment库,则可以从conv获取agent.getConv()对象。

如果您使用的是多声库,则用户配置文件存储在User/Profile下的环境中,并且ID令牌在User/IdentityToken下可用,并且User/IsAuthenticated将设置为true。 / p>

这将发送给您进行本次会话,以及以后的任何会话,只要用户不断开您的“操作”与他们的帐户的连接即可。