更新:有自己的OAuth服务器:
谢谢大家分享一步步的说明链接。而且,我没有火药库托管。
以下是我的理解,如果我错了,请纠正我:
方法1
方法2
如果我错了,请纠正我。
更新:进行以下更改后的:
现在,我在调试部分中获得了授权URL,并且可以通过在另一个选项卡中粘贴该URL来进行授权。
然而,在获取用户信息方面,我仍然面临着一些问题。我在input.welcome意图中有以下代码:
'input.welcome': () => {
// Use the Actions on Google lib to respond to Google requests; for other requests use JSON
if (requestSource === googleAssistantRequest) {
sendGoogleResponse('Hello, Welcome to my First Fulfillment agent!'); // Send simple response to user
app.askForSignIn();
let displayName = app.getUserName().displayName;
console.log(displayName)
} 我得到的只是调试日志中的Null。
之前的问题,,我试图在谷歌的行动意图中获取用户的信息。以下是我所做的:
1.)从控制台为我的项目创建了一个OAUTH密钥。https://console.developers.google.com/apis/dashboard?project=。
2.)登录到console.actions.google.com并点击帐户链接。
3.)输入了信息。请参考截图查看我输入的信息。
4.)在我的“input.welcome”意图中添加了以下代码:
app.askForSignIn(); 现在在模拟器里,我得到了:“看起来你的测试应用帐户还没有链接。”我还从对话框流UI中签入了我的意图所需的登录。

之前的问题,,我试图从我的谷歌助理对话机器人发送一封电子邮件。我能够发送电子邮件到使用nodemailer。但是,我无法获得用户的电子邮件地址。
以下是我发送电子邮件的代码:
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'My-Email',
pass: 'My-Pass',
}
});
var mailOptions = {
from: 'Sender-Email',
to: 'Receiver-Email',
subject: 'Requested Information',
text: 'Your information is here'
};
function sendEmail(){
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
}最后,我称之为行动意图:
'input.sendmail': () => {
sendEmail();
}, 直到这一点,我可以发送电子邮件时,有人说,发送电子邮件给我的谷歌助理行动。
之后,我尝试使用以下方法获取用户的电子邮件地址:
const app = new DialogflowApp({request: request, response: response});
console.log(app.getUserName())
console.log(app.getUser().userName)
console.log(app.getUser().userId)但他们都没有给我用户的信息。相反,我在对话框流控制台日志中获得了以下信息:
{
userStorage: '{"data":{}}',
lastSeen: '2018-03-05T10:18:17Z',
locale: 'en-US',
userId: 'ABadfdfrffsdffNa0H4hlCy_eyZmVNa8LweMJMCyirUg-
qAx8FHwvSI49QurUhxhgLsT6IUU4nGfF1',
user_id: 'ABerysteui4hlCy_eyZmVNa8LweMJMCyirUg-
qAx8FHwvSI49QurUhxhgLsT6IUU4nGfF1',
access_token: undefined,
userName: null
}我试图谷歌这个问题,它似乎我将需要遵循1,但不确定。
如果有人能告诉我1是否是正确的指南,或者我还需要别的东西,我会很感激。
谢谢!
发布于 2018-03-05 13:39:01
这是正确的。出于安全和隐私目的,无法获得与用于设置助手帐户的帐户相关联的电子邮件地址。
实现这一点的正确方法是实现帐户链接。这样,您就可以在您的系统上创建一个帐户,并作为该帐户的一部分,获取用户的电子邮件地址(通常通过应用程序或webapp)。然后,帐户链接将您的帐户连接到助手的帐户,当他们使用该帐户访问您的Action时,您将收到一个访问令牌,您可以使用该令牌来标识您的帐户是哪个帐户。然后,您可以从您的帐户信息获得用户的信息。
当用户第一次被提示链接他们的帐户时,Google用户将在他们手机上的Google应用程序上获得一张活动卡,从而将他们引导到您的auth页面。从移动设备上,它应该直接在助手中打开。
如果您还没有帐户或登录页面,那么您应该能够使用防火墙认证和Google提供商构建它。
清晰更新:为了清楚起见,只需将您的帐户链接到其助手帐户就不会自动向您提供有关其助手帐户的信息。当他们通过请求profile作用域作为OAuth的一部分向您设置帐户时,您可以获得他们的电子邮件地址(原始请求)。然后,当您知道他们通过“助手”与您连接时,您可以使用您收集到的有关他们的信息。
在你更新的问题中,你试图在他们通过助手登录后得到他们的名字。如果你只想要他们的名字,你可以让请求许可得到这个,而不需要帐户链接或登录。(或者,如前所述,当他们与您一起创建帐户时,您可以要求这样做。)
更新(基于您关于OAuth的问题)
两件事,你的更新。
根据您的注释更新,您需要一个OAuth服务器。
是的,你需要一个OAuth服务器。你不能只使用谷歌的,即使你只是想让你的用户登录到他们的谷歌帐户。
有相当多的OAuth服务器可用,但是谷歌搜索“开放源码openid连接服务器”或“开放源码oauth服务器”显示了一些有希望的结果。
此外,谷歌还向您介绍了分步指令对其连接的OAuth服务器的期望。所以你需要
您不需要您自己的域-您可以通过Firebase函数和Firebase主机来实现这两种功能,其中包括项目主机名的SSL证书。
更新,解决实现OAuth2服务器的可能方法。
首先,您不需要为任何事情使用Firebase托管和/或Firebase函数。它们只是为您提供一个有效的HTTPS端点的一个选项。
方法1--使用外部包(如ory)
我不知道Firebase主机在您的示例中有什么意义。auth exchange端点和令牌交换端点正是OAuth2服务器要做的事情。
我不太了解灵芝,但这显然是一个合理的解决办法。您需要在某个地方(AWS、或其他与其协同工作的托管提供商)托管它,但它应该提供所需的端点。通过快速阅读ora,您将需要提供某种类型的帐户后端,并为用户登录该帐户提供一种方式。
方法2-使用Firebase实现
你说的完全正确。使用Firebase函数与使用Firebase身份验证进行登录的登录页面相结合的简单OAuth2实现相当简单(不一定简单,但很简单)。
你采用哪种方法取决于你。使用现有的解决方案肯定更容易,希望更可靠、更安全,并且可以让您更多地关注Action本身,但可能仍然需要大量的集成工作。实现OAuth2服务器将使您更好地理解OAuth2,但问题的风险更高。
发布于 2018-04-03 10:43:56
经过很长一段时间,我才能使它发挥作用。我们必须首先启用web钩子,并且我们可以看到如何在对话框流实现文档中启用web钩子,如果我们要使用Google助手,那么我们必须首先在集成中启用Google助手集成。然后按照下面提到的步骤,在google上的操作中链接帐户:
转到谷歌云控制台-> APIsand Services ->凭据-> OAuth 2.0客户端id -> Web ->注意客户端ID,客户端机密从那里下载json -从JSON记录项目id,auth_uri,token_uri ->授权重定向URL白色列表,我们的应用程序的URL ->在这个URL固定部分是https://oauth-redirect.googleusercontent.com/r/,并在URL->中附加项目id,保存更改
在google ->帐户上的操作链接设置1.格兰特类型=授权代码2.客户端信息1.填写客户id、客户端安全组、auth_uri、token_uri 2.输入auth uri作为https://www.googleapis.com/auth,token_uri作为https://www.googleapis.com/token 3.保存并运行4.在运行谷歌助手时会显示错误,但不要担心5.请回到助理设置中的帐户链接部分,输入auth_uri作为https://accounts.google.com/o/oauth2/auth,token_uri作为https://accounts.google.com/o/oauth2/token 6。将作用域设置为https://www.googleapis.com/auth/userinfo.profile和https://www.googleapis.com/auth/userinfo.email,然后我们很好地运行。7.保存更改。
在主机服务器(Heroku)日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获得有关电子邮件地址的详细信息。
将访问令牌附加到"token=“链接中,我们可以在生成的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"])`https://stackoverflow.com/questions/49105807
复制相似问题