Google "One Tap", конечная точка tokeninfo 404 - PullRequest
0 голосов
/ 08 апреля 2020

В 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>

Когда сайт загружается, он показывает мне приглашение продолжить работу с моей учетной записью Google, я нажмите продолжить, и он показывает, что я вошел в систему, веб-крюк вызывается, и я могу получить g_csrf_token от повара ie

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"
}

Так что это не токен в поваре ie от обратного вызова, который я должен использовать?

1 Ответ

1 голос
/ 27 апреля 2020

g_csrf_token используется для двойной отправки для предотвращения атаки CSRF. Это не возвращенный токен идентификатора.

Как указано в официальном do c (https://developers.google.com/identity/one-tap/web/guides/verify-google-id-token), токен идентификатора возвращается в поле «учетные данные».

...