Ошибка проверки JWT: JsonWebTokenError: неверный алгоритм - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь внедрить единый вход для моего веб-приложения. Я использую gravitee.io для управления доступом и генерации токенов. Я выполнил шаги, описанные в руководстве по быстрому старту gravitees , и теперь я нахожусь в точке, где я хочу проверить свой id_token.

Для этого я использую node-jsonwebtoken библиотека. я использую total.js для своего бэкэнда (что не должно быть так важно, но я все же хотел упомянуть об этом).

Что я сделал до сих пор. У меня есть мой идентификатор клиента и мой секретный ключ клиента, а также секретный ключ моего домена в конфигурационном файле total.js

. / configs / myconfig.conf (ключ / секретный ключ изменен)

url                 : https://sso.my-graviteeInstance.com/am
client-id           : myClientId
client-secret       : uBAscc-zd3yQWE1AsDfb7PQ7xyz
domain              : my_domain
domain-public-key   : EEEEEB3NzaC1yc2EAAAADAQABAAABAQCW4NF4R/sxG12WjioEcDIYwB2cX+IqFJXF3umV28UCHZRlMYoIFnvrXfIXObG7R9W7hk6a6wbtQWERTZxJ4LUQnfZrZQzhY/w1u2rZ3GEILtm1Vr1asDfAsdf325dfbuFf/RTyw666dFcCcpIE+yUYp2PFAqh/P20PsoekjvoeieyoUbNFGCgAoeovjyEyojvezxuTidqjaeJvU0gU4usiiDGIMhO3IPaiAud61CVtqYweTr2tX8KabeK9NNOXlTpLryBf3aTU1iXuU90mijwXZlmIzD28fWq+qupWbHcFZmmv3wADVddnxZHnFIN7DHGf5WVpb3eLvsGkIIQpGL/ZeASDFa

Я добавил модель для обработки рабочего процесса входа в систему для total.js, чтобы получить токены jwt от gravitee с помощью REST-вызова. Пока все работает как положено. сеанс создается и хранит ответ в нем. реакция гравита - ожидаемый json, который выглядит следующим образом:

{
  access_token: 'some-long-token',
  token_type: 'bearer',
  expires_in: 7199,
  scope: 'openid',
  refresh_token: 'another-long-token',
  id_token: 'last-long-token'
}

Я разделил токены на отдельные куки-файлы, потому что, когда я пытался сохранить их как один куки-файл, я получал ошибку, сообщающую, что куки-файл превышаетограничение длины 4096.

Пока все работает просто отлично. во внешнем ajax-вызове будет выполнен обратный вызов успеха, просто установив window.location.href='/'; для вызова информационной панели моего приложения. Я установил доступ к этому маршруту только после авторизации, чтобы при вызове панели мониторинга функция onAuthorize вызывалась totaljs.

F.onAuthorize = function (req, res, flags, callback) {
  let cookie = mergeCookies(req.cookie);

  // Check the cookie length
  if (!cookie || cookie.length < 20) {
    console.log(`cookie not defined or length to low`);
    return callback(false);
  }

  if (!cookie) {
    console.log(`cookie undefined`);
    return callback(false);
  }

  // Look into the session object whether the user is logged in
  let session = ONLINE[cookie.id];
  if (session) {
    console.log(`there is a session`);
    // User is online, so we increase his expiration of session
    session.ticks = F.datetime;

    jwt.verify(
      session.id_token, 
      Buffer.from(CONFIG('client-secret')).toString('base64'),
      function(err, decoded){
        if (err) {
          console.log(`jwt verify error: ${err}`);
          return callback(false);
        }
        console.log(`decoded token user id: ${decoded.sub}`);
        return callback(true, session);
      })
  }
  console.log(`false`);
  callback(false);
};

Я также пытался просто отправить CONFIG('client-secret') без буферизации. Я также пытался отправить CONFIG('domain-public-key'). Но ошибка, которую я получаю, всегда одна и та же:

jwt verify error: JsonWebTokenError: invalid algorithm

Когда я скопирую и вставлю id_token в отладчик по адресу jwt.io с алгоритмом, установленным в RS256, я увижуследующие декодированные значения:

// header
{
  "kid": "default",
  "alg": "RS256"
}

// payload
{
  "sub": "some-generated-id",
  "aud": "myClientId",
  "updated_at": 1570442007969,
  "auth_time": 1570784329896,
  "iss": "https://sso.my-graviteeInstance.com/am/my_domain/oidc",
  "preferred_username": "myUsername",
  "exp": 1570798729,
  "given_name": "Peter",
  "iat": 1570784329,
  "family_name": "Lustig",
  "email": "peter.lustig@domain.com"
}

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

Предупреждение: похоже, ваша подпись JWT неправильно закодирована с использованием base64url (https://tools.ietf.org/html/rfc4648#section-5). Обратите внимание, что padding ("=")должен быть пропущен согласно https://tools.ietf.org/html/rfc7515#section-2

Я не понимаю, почему возникает ошибка алгоритма при попытке проверить токен в моем бэкэнде и некоторая ошибка кодирования в jwt.io отладчик.

Может кто-нибудь объяснить мне, как решить проблему? Заранее спасибо Паскаль

edit: изменил заголовок

...