Actions on google Google隐式帐户链接的操作在模拟器/浏览器中工作,但在设备上不工作(通过Google Home app)
我已经在Google帐户链接上实现了操作的隐式流,并且正在使用Dialogflow(以前的API.AI)来定义意图 全流程在设备模拟器中工作(来自AOG)。第一个意图得到一个“看起来你的帐户还没有链接…”响应,调试窗格包含一个URL来启动链接: 如果在无缓存窗口中遵循此URI:Actions on google Google隐式帐户链接的操作在模拟器/浏览器中工作,但在设备上不工作(通过Google Home app),actions-on-google,dialogflow-es,google-home,Actions On Google,Dialogflow Es,Google Home,我已经在Google帐户链接上实现了操作的隐式流,并且正在使用Dialogflow(以前的API.AI)来定义意图 全流程在设备模拟器中工作(来自AOG)。第一个意图得到一个“看起来你的帐户还没有链接…”响应,调试窗格包含一个URL来启动链接: 如果在无缓存窗口中遵循此URI: 我被重定向到我的应用程序的身份验证页面 我选择使用我的Google帐户登录(与上面的[帐户]相同) 我被重定向到google.com,URI栏中有一条成功消息 模拟器现在通过我的应用程序接受操作并正确响应 然而,如果我
关于:invalid@zClosurez
finish_auth(id_token) {
let provider = {
uri: '/api/auth/google_auth',
params: ['client_id', 'redirect_uri', 'state', 'response_type'],
name: "Google Assistant"
}
if (provider) {
let data = {};
provider.params.forEach((p) => {
data[p] = this.props.location.query[p];
});
if (id_token) data.id_token = id_token;
api.post(provider.uri, data, (res) => {
if (res.redirect) window.location = res.redirect;
else if (res.error) toastr.error(res.error);
});
} else {
toastr.error("Provider not found");
}
}
provider.uri命中此API终结点:
def google_auth(self):
client_id = self.request.get('client_id')
redirect_uri = self.request.get('redirect_uri')
state = self.request.get('state')
id_token = self.request.get('id_token')
redir_url = user = None
if client_id == DF_CLIENT_ID:
# Part of Google Home / API.AI auth flow
if redirect_uri == "https://oauth-redirect.googleusercontent.com/r/%s" % secrets.GOOGLE_PROJECT_ID:
if not user:
ok, _email, name = self.validate_google_id_token(id_token)
if ok:
user = User.GetByEmail(_email, create_if_missing=True, name=name)
if user:
access_token = user.aes_access_token(client_id=DF_CLIENT_ID)
redir_url = 'https://oauth-redirect.googleusercontent.com/r/%s#' % secrets.GOOGLE_PROJECT_ID
redir_url += urllib.urlencode({
'access_token': access_token,
'token_type': 'bearer',
'state': state
})
self.success = True
else:
self.message = "Malformed"
else:
self.message = "Malformed"
self.set_response({'redirect': redir_url}, debug=True)
不确定您正在使用哪些python中间件或模块,但
self.set_response({'redirect': redir_url}, debug=True)
似乎正在为返回不正确的响应设置参数。相反,您应该将响应重定向到重定向url。例如,在Flask或Django中导入重定向模块:
从flask导入重定向
或从django.shortcuts导入重定向
然后像这样重定向:
return redirect(redirect_url)
谷歌似乎已经做出了一项改变,部分解决了这个问题,因为现在可以在模拟器之外完成隐式帐户链接流,就像我在问题中概述的那样 问题似乎源于使用Google登录按钮登录后使用的客户端重定向案例的奇怪处理(在AOG端) 来自杰夫·克雷格: 当前的解决方法是,我们提供“返回应用程序”链接 目前我们所能提供的。问题在于它的方式 重定向到自定义方案URI是在Chrome中处理的,特别是, 关于在用户操作上下文中发生的重定向 XHR将破坏该上下文,因此所发生的是您单击 谷歌登录按钮触发对谷歌服务器的XHR, 然后(很可能)执行客户端重定向,返回到 重定向我们提供的url,我们的处理程序执行,并且无法执行 JS重定向到应用程序的自定义方案URI,因为我们在外部 直接用户单击的上下文 这更多的是隐式(response_type=token)流的问题 而不是授权代码(响应类型=代码)流 “返回应用程序”链接是我们目前最好的回退案例, 尽管我们也一直在寻找更好的解决方案
当前行为显示“返回应用程序”链接,但截至上周,此链接的href不再是关于:invalid@zClosurez,但成功完成了登录和链接过程。这是一个奇怪且令人困惑的用户体验,我希望谷歌在未来能有所改进,但这足以让我的应用程序获得AOG团队的批准,而不需要对我的流程进行任何更改。我能够在很长一段时间后使其正常工作。我们必须首先启用webhook,我们可以看到如何在对话框流实现文档中启用webhook如果我们要使用Google Assistant,那么我们必须首先在集成中启用Google Assistant集成。然后按照下面提到的步骤在google上的actions中链接帐户:- 转到google云控制台->APIsand服务->凭证->OAuth 2.0客户端ID->Web客户端->记录客户端ID、客户端机密->下载JSON-从JSON记录项目ID、auth_uri、,令牌\u uri->授权重定向uri->白名单我们的应用程序的URL->在这个URL固定部分是,并在URL中追加项目id->保存更改 谷歌->帐户链接设置1上的操作。授权类型=授权代码2。客户信息1。填写客户端id、客户端密码、身份验证uri、令牌uri 2。将身份验证uri输入为,将令牌_uri输入为3。保存并运行4。在谷歌助手上运行时,它会显示一个错误,但不要担心。回到助手设置中的帐户链接部分,输入auth_uri as和token_uri as 6。把望远镜放好,我们可以走了。7.保存更改 在托管服务器(heroku)日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获得有关电子邮件地址的详细信息 将访问令牌附加到此链接“”中,我们可以在生成的json页面中获得所需的详细信息
`accessToken = req.get("originalRequest").get("data").get("user").get("accessToken")
r = requests.get(link)
print("Email Id= " + r.json()["email"])
print("Name= " + r.json()["name"])`
在手机上的谷歌助手应用程序中进行测试时,是否也会出现同样的行为?您是否可以更新您的问题以包含您重定向到的URL?(屏蔽您的项目ID、访问令牌和状态?@Nazeem yes。围棋