在 Google 缺少授权类型的操作中帐户与我自己的 OAuth 服务器链接
Account Linking with my own OAuth server in Actions on Google missing grant type
我正在尝试实施智能家居操作。
它从这个例子开始
https://codelabs.developers.google.com/codelabs/smarthome-washer/#0
这很有效。
此示例使用 firestore 作为云服务。
我想自己实现服务器。作为我本地 PC 上的服务器的第一次测试,可以通过端口转发访问。
我创建了一个 let's encrypt 证书并使用了 nodejs express htpps 服务器。
对于 Oauth 实现,我使用与示例相同的 "unsecure" 代码。
expressApp.get('/fakeauth', async (req, res) => {
console.log('fakeauth',req.headers, req.body, req.query);
const responseurl = util.format('%s?code=%s&state=%s',
decodeURIComponent(req.query.redirect_uri), 'xxxxxx',
req.query.state);
console.log(responseurl);
return res.redirect(responseurl);
});
expressApp.all('/faketoken', async (req, res) => {
console.log('faketoken',req.headers, req.body, req.query);
const grantType = req.query.grant_type
? req.query.grant_type : req.body.grant_type;
const secondsInDay = 86400; // 60 * 60 * 24
const HTTP_STATUS_OK = 200;
console.log(`Grant type ${grantType}`);
let obj;
if (grantType === 'authorization_code') {
obj = {
token_type: 'bearer',
access_token: '123access',
refresh_token: '123refresh',
expires_in: secondsInDay,
};
} else if (grantType === 'refresh_token') {
obj = {
token_type: 'bearer',
access_token: '123access',
expires_in: secondsInDay,
};
}
res.status(HTTP_STATUS_OK)
.json(obj);
});
现在我更改了将 urls 链接到我的本地服务器的帐户。
当我尝试连接到此操作时,它不起作用。
对fakeauth端点的请求正常。
但是当 google 调用 faketoken 端点时,查询丢失并且正文为空。
请求的 url 是 .../faketoken 没有任何查询和空主体。
fakeauth 请求的响应不会有问题,因为如果我将 fakeauth 请求发送到我的服务器并将 faketoken 请求发送到 firestore 服务器,帐户链接就可以正常工作。
第二个我试过了。
将 fakeauth 发送到 firestore 服务器,将 faketoken 发送到我的服务器。
结果是一样的。没有查询也没有正文。
我不知道我做错了什么,因为 google 的请求是错误的。
有没有人知道哪里出了问题。我已经搜索过了,但没有找到有同样问题的人。
感谢您的帮助。
问候西蒙
您可以使用 Google OAuth Playground 来验证您的帐户链接实施是否正常工作。以下是配置此工具以测试自定义端点的方法:
- 打开设置齿轮,将OAuth端点更改为自定义
- 从 Actions 控制台输入您的授权和令牌 URL
- 从 Actions 控制台输入您的客户端 ID 和密码
您不会授权任何 Google API,因此对于 第 1 步,您只需输入类似 "devices" 的内容,然后单击 授权API。您可以按照步骤 2 中的流程来验证授权和令牌交换是否正常工作。如果流程中出现任何错误,该工具将报告。
为了帮助其他人,我将描述问题。
我认为数据是作为 url 查询发送的,因为代码是从查询对象中读取的。
但是它们是在正文中发送的,内容类型为:application/x-www-form-urlencoded
如果我用
expressApp.use(bodyParser.urlencoded());
数据已添加到查询中,原始测试代码正在运行。
我正在尝试实施智能家居操作。
它从这个例子开始
https://codelabs.developers.google.com/codelabs/smarthome-washer/#0
这很有效。
此示例使用 firestore 作为云服务。
我想自己实现服务器。作为我本地 PC 上的服务器的第一次测试,可以通过端口转发访问。
我创建了一个 let's encrypt 证书并使用了 nodejs express htpps 服务器。
对于 Oauth 实现,我使用与示例相同的 "unsecure" 代码。
expressApp.get('/fakeauth', async (req, res) => {
console.log('fakeauth',req.headers, req.body, req.query);
const responseurl = util.format('%s?code=%s&state=%s',
decodeURIComponent(req.query.redirect_uri), 'xxxxxx',
req.query.state);
console.log(responseurl);
return res.redirect(responseurl);
});
expressApp.all('/faketoken', async (req, res) => {
console.log('faketoken',req.headers, req.body, req.query);
const grantType = req.query.grant_type
? req.query.grant_type : req.body.grant_type;
const secondsInDay = 86400; // 60 * 60 * 24
const HTTP_STATUS_OK = 200;
console.log(`Grant type ${grantType}`);
let obj;
if (grantType === 'authorization_code') {
obj = {
token_type: 'bearer',
access_token: '123access',
refresh_token: '123refresh',
expires_in: secondsInDay,
};
} else if (grantType === 'refresh_token') {
obj = {
token_type: 'bearer',
access_token: '123access',
expires_in: secondsInDay,
};
}
res.status(HTTP_STATUS_OK)
.json(obj);
});
现在我更改了将 urls 链接到我的本地服务器的帐户。 当我尝试连接到此操作时,它不起作用。
对fakeauth端点的请求正常。
但是当 google 调用 faketoken 端点时,查询丢失并且正文为空。
请求的 url 是 .../faketoken 没有任何查询和空主体。
fakeauth 请求的响应不会有问题,因为如果我将 fakeauth 请求发送到我的服务器并将 faketoken 请求发送到 firestore 服务器,帐户链接就可以正常工作。
第二个我试过了。
将 fakeauth 发送到 firestore 服务器,将 faketoken 发送到我的服务器。
结果是一样的。没有查询也没有正文。
我不知道我做错了什么,因为 google 的请求是错误的。
有没有人知道哪里出了问题。我已经搜索过了,但没有找到有同样问题的人。
感谢您的帮助。
问候西蒙
您可以使用 Google OAuth Playground 来验证您的帐户链接实施是否正常工作。以下是配置此工具以测试自定义端点的方法:
- 打开设置齿轮,将OAuth端点更改为自定义
- 从 Actions 控制台输入您的授权和令牌 URL
- 从 Actions 控制台输入您的客户端 ID 和密码
您不会授权任何 Google API,因此对于 第 1 步,您只需输入类似 "devices" 的内容,然后单击 授权API。您可以按照步骤 2 中的流程来验证授权和令牌交换是否正常工作。如果流程中出现任何错误,该工具将报告。
为了帮助其他人,我将描述问题。
我认为数据是作为 url 查询发送的,因为代码是从查询对象中读取的。
但是它们是在正文中发送的,内容类型为:application/x-www-form-urlencoded
如果我用
expressApp.use(bodyParser.urlencoded());
数据已添加到查询中,原始测试代码正在运行。