Проверка Google одним нажатием: неверное количество сегментов в токене - PullRequest
1 голос
/ 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, я нажмите продолжить и он показывает, что я вошел в систему, webhook действительно вызывается, и я могу получить g_csrf_token от повара ie, затем я пытаюсь проверить это, используя google-auth-library, как описано здесь, в документации. , которая связана с документами одним нажатием здесь

const { OAuth2Client } = require("google-auth-library");
...
app.post("/google", function(req, res) {
  const idToken = req.cookies.g_csrf_token;
  const audience = process.env.GOOGLE_CLIENT_ID
  const client = new OAuth2Client(audience);
  async function verify() {
    const ticket = await client.verifyIdToken({ idToken, audience });
    const payload = ticket.getPayload();
    const userid = payload["sub"];
    console.log('------------------ userid');
    console.log(userid);
  }
  verify().catch(console.error);
  res.status(200).send({ req });
});

Я получаю ошибку

Error: Wrong number of segments in token: 87ba1eb4d6261b6b      at OAuth2Client.verifySignedJwtWithCertsAsync (/app/node_modules/google-auth-library/build/src/auth/oauth2client.js:525:19)      at OAuth2Client.verifyIdTokenAsync (/app/node_modules/google-auth-library/build/src/auth/oauth2client.js:391:34)      at processTicksAndRejections (internal/process/task_queues.js:97:5)      at async verify (/app/server.js:71:20)

Документы предполагают, что мы должны получить токен в качестве параметра POST, а также в cook ie, я проверил req.body.credential, req.query.credential, req.params.credential, но токен не найден, из документов здесь

After an ID token is returned from Google, it's submitted by an HTTP POST method request to your login endpoint with the parameter name credential.

1 Ответ

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

Я понял это - мы оба использовали g_csrf_token cook ie для idToken, но это неправильно!

Вам нужно получить request.body.credential (или req.body.credential в вашем случае ) вместо этого, который является JWT. Тогда это должно работать!

...