node.js - 谷歌“一键式”,tokeninfo 端点 404
问题描述
<script src="https://accounts.google.com/gsi/client"></script>
<div
id="g_id_onload"
data-client_id={googleClientID}
data-login_uri='https://mytestdomain.appspot.com/google'
data-return_uri={uri}
></div>
当网站加载时,它会提示我继续使用我的谷歌帐户,我点击继续,它显示我已登录,webhook 确实被调用,我可以g_csrf_token
从 cookie中获取
const fetch = require("node-fetch");
...
app.post("/google", function(req, res) {
const token = req.cookies.g_csrf_token;
console.log('-------------- token');
console.log(token);
const url = `https://oauth2.googleapis.com/tokeninfo?id_token=${token}`
const getData = async (url) => {
try {
const response = await fetch(url);
console.log('-------------- response');
console.log(response);
const json = await response.json();
console.log('-------------- json');
console.log(json);
res.status(200).send({ data });
} catch (error) {
console.log('-------------- error');
console.log(error);
res.status(400).send({ error });
}
};
if (token) getData(url);
res.status(200).send({ req });
});
但是,当我尝试调用此处文档中详述的令牌信息端点时,出现错误
-------------- token
d7d07535919b8e26
-------------- response
Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]: {
body: PassThrough {
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 5,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: true,
_transformState: [Object],
[Symbol(kCapture)]: false
},
disturbed: false,
error: null
},
[Symbol(Response internals)]: {
url: 'https://oauth2.googleapis.com/tokeninfo?id_token=d7d07535919b8e26',
status: 404,
statusText: 'Not Found',
headers: Headers { [Symbol(map)]: [Object: null prototype] },
counter: 0
}
}
文档说我可以使用 GET 或 POST,我都尝试过相同的错误响应
如果我尝试通过输入https://oauth2.googleapis.com/tokeninfo?id_token=d7d07535919b8e26
地址栏来调用浏览器中的端点,我会得到响应
{
"error": "invalid_token",
"error_description": "Invalid Value"
}
那么这不是我应该使用的回调中cookie中的令牌吗?
解决方案
g_csrf_token 用于双重提交以防止 CSRF 攻击。它不是返回的 ID 令牌。
如官方文档 ( https://developers.google.com/identity/one-tap/web/guides/verify-google-id-token ) 中所述,ID 令牌在“凭据”字段中返回。
推荐阅读
- reactjs - 如何将 className 添加到单个 .map 项?
- windows - 如何在按住滚动条的同时强制重绘 WIN32 滚动窗口
- python - 向文件写入数据时如何使用 Django 流式下载文件?
- android - CertificateTransparency:失败:没有证书
- javascript - 使用 javascript 获取子元素值
- flutter - 您可以将前台的操作小部件跳过到另一个小部件吗?
- php - php - 使用 HTMLPurifier 清理文本输入 - 然后重新显示 - 撇号问题
- python - 为什么我会收到 RuntimeWarning:启用 tracemalloc 以从 asyncio.run 获取对象分配回溯?
- c# - C# - 使用 Windows 服务将串行数据发送到活动窗口
- c - 如何在 cgo 函数中操作 C 字符数组?