首页 > 解决方案 > 谷歌“一键式”,tokeninfo 端点 404

问题描述

在我从此处的文档中获得的站点的 HTML 中

<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中的令牌吗?

标签: node.jsexpressgoogle-oauth

解决方案


g_csrf_token 用于双重提交以防止 CSRF 攻击。它不是返回的 ID 令牌。

如官方文档 ( https://developers.google.com/identity/one-tap/web/guides/verify-google-id-token ) 中所述,ID 令牌在“凭据”字段中返回。


推荐阅读