我已经成功使用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);
答案 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>
这将发送给您进行本次会话,以及以后的任何会话,只要用户不断开您的“操作”与他们的帐户的连接即可。