Dialogflow Webhook V2 帐户链接无法获取用户个人资料信息
Dialogflow Webhook V2 Account linking cannot get user profile info
我已经设法使用 google sdk 和 Dialogflow 上的操作在 Android 上建立帐户链接,但无法使用新的 Dialogflow V2 webhook 使其工作。
它确实请求 link 帐户的权限并且确实发生了 linking 帐户,但我无法访问 given_name、电子邮件等用户数据。
我已经完成了所需的一切,包括使用 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))
}
在 Prisoner 的帮助下,我设法解决了这个问题。您基本上只是获得必须解码的令牌。这是相关代码。
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);
一旦用户使用 Google 登录助手登录 一次,所有进一步的请求都将包含一个 ID 令牌。
如果您使用的是 actions-on-google 库,令牌将在 conv
对象中作为 conv.user.profile.id
和配置文件信息本身("payload" 的 id 令牌)将在 conv.user.profile.payload
.
如果您使用的是 dialogflow-fulfillment 库,则可以从 agent.getConv()
获取 conv
对象。
如果您使用的是 multivocal 库,则用户配置文件存储在 User/Profile
下的环境中,其中 id 令牌在 User/IdentityToken
下可用,并且 User/IsAuthenticated
将设置为 true .
只要用户不断开您的操作与他们帐户的连接,此会话和任何未来会话都会发送给您。
我已经设法使用 google sdk 和 Dialogflow 上的操作在 Android 上建立帐户链接,但无法使用新的 Dialogflow V2 webhook 使其工作。 它确实请求 link 帐户的权限并且确实发生了 linking 帐户,但我无法访问 given_name、电子邮件等用户数据。 我已经完成了所需的一切,包括使用 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))
}
在 Prisoner 的帮助下,我设法解决了这个问题。您基本上只是获得必须解码的令牌。这是相关代码。
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);
一旦用户使用 Google 登录助手登录 一次,所有进一步的请求都将包含一个 ID 令牌。
如果您使用的是 actions-on-google 库,令牌将在 conv
对象中作为 conv.user.profile.id
和配置文件信息本身("payload" 的 id 令牌)将在 conv.user.profile.payload
.
如果您使用的是 dialogflow-fulfillment 库,则可以从 agent.getConv()
获取 conv
对象。
如果您使用的是 multivocal 库,则用户配置文件存储在 User/Profile
下的环境中,其中 id 令牌在 User/IdentityToken
下可用,并且 User/IsAuthenticated
将设置为 true .
只要用户不断开您的操作与他们帐户的连接,此会话和任何未来会话都会发送给您。