Невозможно проверить client_assertion: ключ не найден

Я использую библиотеку Singpass NdiOidcHelper (@govtechsg/singpass-myinfo-oidc-helper) для обработки входа в систему Singpass и получения токенов в моем приложении Node.js. Я определил объект хранилища ключей с параметрами ключа EC и использовал его для создания ключа знака утверждения клиента. Однако когда я пытаюсь получить токен с помощью метода getTokens, я получаю сообщение об ошибке «Невозможно проверить client_assertion: ключ не найден».

Вот объект хранилища ключей и объект ключа, которые я использую:

      const keystore = {
    kty: 'EC',
    kid: 'gfU0OIt2KoTz8JIm6naqVsbyGUs8mtiMr_k5GnLPmxI',
    use: 'sig',
    alg: 'ES256',
    crv: "P-256",
    x  : "SVqB4JcUD6lsfvqMr-OKUNUphdNn64Eay60978ZlL74",
    y  : "lf0u0pMj4lGAzZix5u4Cm5CMQIgMNpkwy163wtKYVKI",
    d  : "0g5vAEKzugrXaRbgKG0Tj2qJ5lMP4Bezds1_sTybkfk",
    e  : "AQAB",
}

const key = {
    "key": keystore,
    "format": 'json',
    "alg": 'ES256',
}

Я получаю сообщение об ошибке «Невозможно проверить client_assertion: ключ не найден», когда я делаю запрос к API /assert. Может кто-нибудь помочь мне понять, что не так с моим кодом?

Вот код для обработки входа в систему Singpass и получения токена:

/логин API:

      app.get('/login', async (req, res) => {
  const state = Math.random().toString(36).substring(2);
  const redirectURL = await server.constructAuthorizationUrl(state, 'test')
  res.cookie('connect.sid', '').redirect(redirectURL)
})

/утверждение API:

      app.get('/assert', async (req, res) => {
  const token = await server.getTokens(req.query.code)
  console.log('Token', token)
})

Я не уверен, возникла ли проблема с моим ключом или возникла ошибка в методе getTokens. Я также пытался использовать известные ключи макета, но все еще сталкиваюсь с той же ошибкой. Любая помощь в решении этой проблемы будет принята с благодарностью.

1 ответ

Вы должны убедиться, что client_assertion правильно создан с помощью библиотеки jose, иначе вы всегда будете получать эту ошибку:

      Unable to verify client_assertion: no key found

Итак, как убедиться, что он правильно построен в соответствии с документацией :

  • Заголовок (тип, alg, kid)
  • Полезная нагрузка (sub, aud, iss и т. д.)
  • Подпись** (вам необходимо подписать правильный закрытый ключ)

Если какое-либо из приведенных выше значений неверно при создании JWT утверждения клиента, произойдет ошибка.

**Вы упомянули, что «попытались использовать общеизвестные ключи макета», что уже неправильно, поскольку вам необходимо подписать проверяющую сторону (rp) в файле oidc-v2-rp-secret.json.

Другие вопросы по тегам