Dialogflow es Google登录:当使用dialogflow实现库而不是Google上的操作时,如何轻松解码令牌?

Dialogflow es Google登录:当使用dialogflow实现库而不是Google上的操作时,如何轻松解码令牌?,dialogflow-es,actions-on-google,Dialogflow Es,Actions On Google,我需要从谷歌用户档案中获取电子邮件地址 我使用Dialogflow并实现了获取客户端ID(由Google发布给您的操作),同时我还实现了操作.intent.SIGN_INintent(如上所述)。我确实收到了包含用户谷歌个人资料信息的谷歌ID令牌,问题在于解码令牌 如果我正在使用,我可以按照以下示例进行操作: 如果使用Google client library for Node.js上的操作,将为您验证和解码令牌,并允许您访问配置文件内容,如以下代码段所示: const{dialogflow}=

我需要从谷歌用户档案中获取电子邮件地址

我使用Dialogflow并实现了获取
客户端ID
(由Google发布给您的操作),同时我还实现了
操作.intent.SIGN_IN
intent(如上所述)。我确实收到了包含用户谷歌个人资料信息的谷歌ID令牌,问题在于解码令牌

如果我正在使用,我可以按照以下示例进行操作:

如果使用Google client library for Node.js上的操作,将为您验证和解码令牌,并允许您访问配置文件内容,如以下代码段所示:

const{dialogflow}=require('actions-on-google');
const app=dialogflow({
//将占位符替换为操作项目的客户端ID
clientId:客户端ID,
})
//启动帐户链接流的意图。
app.intent('Start sign',conv=>{
conv.ask(新登录(“获取您的帐户详细信息”)
})
//在“事件”中创建带有“操作”和“意图”符号的Dialogflow意图。
app.intent('Get Signin',(conv,params,Signin)=>{
如果(signin.status==‘OK’){
const payload=conv.user.profile.payload
conv.ask(`I获得了您的帐户详细信息,${payload.name}。您下一步想做什么?`)
}否则{
conv.ask(`我将无法保存您的数据,但您下一步想做什么?`)
}
})
问题是我正在使用(因为我正在使用Google Assistant和其他集成)

从他们的示例代码中,我使用
WebhookClient
遵循这种方法:

const functions=require('firebase-functions');
const{WebhookClient}=require('dialogflow-fulfillment');
功能(代理){
if(agent.requestSource==谷歌上的agent.ACTIONS){
//让conv=agent.conv();
//做一些谷歌特有的事情…conv.ask(…);
add('你来自谷歌的Actions');
}否则{
add('您来自任何其他来源…');
}
}
exports.dialogflowFirebaseFulfillment=functions.https.onRequest((请求,响应)=>{
const-agent=new-WebhookClient({request,response});
让intentMap=newmap();
intentMap.set('some-intent',someIntent);
代理handleRequest(intentMap);
});
因此,问题是:是否可以将我的
客户端ID
(从我的操作项目)传递到
对话框流实现
,以便it解码令牌(就像谷歌上的
操作一样)


ps:我知道有JWT解码库和一个我可以遵循的验证和解码令牌。但是由于
dialogflow实现
我想在谷歌内部使用了
操作
,我只是想知道是否有更简单的方法来实现它。

没有,据我所知,令牌验证是在谷歌actions上的dialogflow类中完成的,该类处理所有操作以及与dialogflow API的通信。这被Dialogflow实现库中的WebhookClient所取代,而Dialogflow实现库不这样做。您可以查看此链接以查看。

***编辑:**

这甚至更短,似乎是正确的方法。摘自Node.js示例:

const{OAuth2Client}=require('google-auth-library');
const client=新的OAuth2Client(客户端ID);
异步函数验证(){
const ticket=wait client.verifyIdToken({

idToken:token,//您能详细说明一下您在这里做了什么吗?我尝试了相同的过程,但出现了以下错误:错误的收件人,有效负载观众!=OAuth2Client上的Required观众。您在google操作控制台上使用了什么链接类型?@SimonSchubert我使用的是“google登录”链接类型,而不是oAuth类型。据我所知,受众是分配给Actions项目的客户端ID(它是在AOG控制台上配置链接类型的最后一步中提供给您的ID,以及上面代码中的
客户端ID
)。我只想到你可能使用了无效的客户端id?这是这里唯一可配置的东西,这可能解释了你得到的错误中的
anonymous
。@SimonSchubert我想到了其他东西。在本地测试时,我在CLI上使用
GOOGLE\u APPLICATION\u CREDENTIALS
env变量。这是正确设置的<当从json文件读取服务帐户凭据时,code>projectId
。当从firebase服务器运行时,会自动检测到
projectId
。您的
客户端ID
与运行代码时检测到的
projectId
之间可能存在不匹配,这就是为什么您的访问者don't match.Jap,我错配了客户端id和projectId。现在可以正常工作了。非常感谢!@GreivinLópez类似这样的东西可能会帮助你:
const{SignIn}=require('actions-on-google');let conv=agent.conv();//只有在我们没有令牌的情况下才请求登录,如果没有令牌,我们还没有被拒绝(!parameters._拒绝&&!(conv.user&&conv.user.profile&&conv.user.profile.token)){conv.ask(新登录('此处有一些文本');agent.add(conv);}
参数。_拒绝
是我存储的一些内部参数,不请求登录两次