更新:拥有自己的OAuth服务器:
感谢您分享分步说明链接。另外,我没有firebase托管。
以下是我的理解,请在任何我错的地方纠正我:
方法1
我需要激活firebase托管并构建2个端点。一个用于授权交换,另一个用于令牌交换。
我需要使用OAuth服务器。让我们说:ory-hydra并使用我在firebase中创建的端点对其进行配置。或AWS Lambda。
在互联网上的某个地方托管OAuth(ory-hydra)服务器。
在谷歌上的操作中使用这些端点,并创建一个简单的网页,用户将被重定向到进行身份验证。
方法2
我需要激活firebase托管并构建2个端点。一个用于授权交换,另一个用于令牌交换。
使用firebase函数实现OAuth和令牌端点。 (我不知道如何做到这一点,如果可能的话)
在谷歌上的操作中使用这些端点,并创建一个简单的网页,用户将被重定向到进行身份验证。
如果我错了,请纠正我。
更新:进行以下更改后:
现在,我在调试部分获取了授权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。
上一个问题我正在尝试在Google操作意图中获取用户的信息。以下是我的所作所为:
1。)从谷歌开发者控制台为我的项目创建了一个OAUTH密钥。 https://console.developers.google.com/apis/dashboard?project=
2.。)登录console.actions.google.com并点击“帐户关联”。
3。)输入信息。请参阅屏幕截图以查看我输入的信息。
4.。)在我的'input.welcome'意图中添加了以下代码:
app.askForSignIn();
现在在模拟器中,我得到了:“看起来我的测试应用帐户尚未关联。”我还从对话框流UI中检查了我的意图所需的登录。
上一个问题 我正在尝试从我的Google助理会话机器人发送电子邮件。我可以使用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)
但他们都没有给我用户的信息。相反,我在dialogflow控制台日志中获得以下信息:
{
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]是否是正确的指南,或者我还需要其他的东西,我将不胜感激?
谢谢!
[1] https://developers.google.com/actions/identity/account-linking
答案 0 :(得分:0)
这是正确的。出于安全和隐私目的,无法获取与用于设置智能助理帐户的帐户相关联的电子邮件地址。
正确的方法是实施帐户关联。有了这个,您将在您的系统上创建一个帐户,并作为该帐户的一部分,获取用户的电子邮件地址(通常通过应用程序或Web应用程序)。然后,帐户关联会将您的帐户与助理帐户相关联,当他们使用该帐户访问您的操作时,您会收到一个访问令牌,您可以使用该令牌来识别您的帐户。然后,您可以从帐户信息中获取用户的信息。
当系统首次提示用户关联其帐户时,Google Home用户会在手机上的Google Home应用中获得一张活动卡片,该卡片会将其引导至您的身份验证页面。在移动设备上,它应该直接在智能助理中打开。
如果您还没有帐户或登录页面,则应该可以使用Firebase Authentication和Google身份验证提供程序进行构建。
为了清晰起见而更新:要明确 - 只需将您的帐户与其助理帐户相关联,您就不会自动向您提供有关其助理帐户的信息。您可以通过请求profile
范围作为OAuth的一部分来获取他们的电子邮件地址(您的原始请求)。然后,当您知道他们通过智能助理与您联系时,您可以使用您收集的有关他们的信息。
在您更新的问题中,您在通过智能助理登录后尝试获取其姓名。如果您想要的只是他们的名字,您可以asked for permission获得此名称,而无需帐户链接或登录。 (或者,如上所述,您可能在他们创建帐户时要求这样做。)
更新(基于您关于OAuth的问题)
您的更新有两件事。
出现提示"您的帐户似乎尚未关联"是正常的。您需要使用响应标签中提供的网址继续进行帐户关联。
然而,更重要的是,它听起来并不像您设置了OAuth 服务器 - 只是您正在尝试配置内容。屏幕截图使您看起来只是使用应该使用auth令牌响应的URL - 而不是系统将要求它们的位置。确保您已阅读https://developers.google.com/actions/identity/account-linking处的文档,以了解配置中应包含哪些值以及您需要执行的其他任务。
更新。
是的,您需要一台OAuth服务器。即使您只是希望用户登录自己的Google帐户,也不能只使用Google。
有相当多的OAuth服务器可供使用,但谷歌搜索了#34;开源openid连接服务器"或者"开源oauth服务器"显示了一些有希望的结果。
此外,Google会为您提供step-by-step instructions有关其连接的OAuth服务器的期望。所以你需要
您不需要自己的域名 - 您可以通过Firebase功能和Firebase托管实施这两项功能,其中包含项目主机名的SSL证书。
更新解决实施OAuth2服务器的可能方法。
首先,您不需要使用Firebase托管和/或Firebase功能。它们只是一个为您提供有效HTTPS端点的选项。
方法1 - 使用外部包,例如ory-hydra
我不确定Firebase Hosting在您的示例中有什么意义。 auth交换端点和令牌交换端点正是OAuth2服务器所要做的。
我对ory-hydra一无所知,但这似乎是一个合理的解决方案。您需要在某个地方托管它(AWS,Google Compute Engine或其他可以使用它的托管服务提供商),但它应该提供您需要的端点。通过快速阅读ora-hydra,您需要提供某种帐户后端以及用户登录该帐户的方式。
方法2 - 使用Firebase实施
你完全正确。使用Firebase云功能和Firebase托管上托管的登录页面进行简单的OAuth2实施(使用Firebase身份验证进行登录)相当简单(不一定简单 - 但直截了当)。
您采取的方法取决于您。使用现有的解决方案当然更容易,希望更可靠和更安全,并且可以让您更专注于Action本身,但可能仍需要大量的集成工作。实施OAuth2服务器可以让您更好地了解OAuth2,但会遇到更高的问题风险。
答案 1 :(得分:0)
很长一段时间后我能够让它发挥作用。我们必须首先启用webhook,我们可以看到如何在对话框流程实现文档中启用webhook如果我们要使用Google智能助理,那么我们必须首先在集成中启用Google智能助理集成。然后按照下面提到的步骤进行谷歌操作中的帐户关联: -
转到Google云端控制台 - > API和服务 - >凭证 - > OAuth 2.0客户端ID - >网络客户端 - >请注意客户端ID,客户端密码 - >下载JSON - 从json记下项目id,auth_uri,token_uri - >授权重定向URI - >白名单我们的应用程序的URL - >在此网址中,已修复的部分为https://oauth-redirect.googleusercontent.com/r/,并将项目ID附加到网址中 - >保存更改
Google上的操作 - >帐户链接设置1.授予类型=授权代码2.客户信息1.填写客户端ID,客户端secrtet,auth_uri,token_uri 2.输入auth uri为https://www.googleapis.com/auth,token_uri为https://www.googleapis.com/token 3.保存在谷歌助手上运行时会显示错误,但不要担心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)日志中,我们可以看到访问令牌值,通过访问令牌,我们可以获取有关电子邮件地址的详细信息。
将访问令牌附加到此链接“https://www.googleapis.com/oauth2/v1/userinfo?access_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"])`