Как должен выглядеть файл cookie JWT для работы с модулями NGINX? - PullRequest
0 голосов
/ 12 сентября 2018

Я использовал NGINX в качестве обратного прокси-сервера и недавно решил, что мне нужно добавить аутентификацию в маршрут на веб-сайте.Я понял, что есть несколько модулей NGINX, которые могут позволить мне обрабатывать аутентификацию через NGINX (см. Ссылки ниже).Итак, я создаю единственную страницу входа в систему, которая объединяет auth0, чтобы проверить, как это будет работать.

Все модули похожи и позволяют вам также указать auth_jwt_key (для проверки JWT)в качестве переменной, где хранится JWT (auth_jwt).Я решил сохранить JWT в файле cookie.

К сожалению, я не могу заставить работать проверку через NGINX и постоянно вижу код возврата 401 unauthorized.

Вот частьприложение фляги, где я обрабатываю вход в систему auth0 и сохраняю JWT в cookie:

@app.route('/callback')
    def callback_handling():
    token = auth0.authorize_access_token()
    response = redirect('/dashboard')
    response.set_cookie('lt_jwt', value=token.get('id_token'), max_age=token.get('expires_in'))
    return response

Можете ли вы увидеть что-то не так с этим? Полученный файл cookie выглядит примерно так (яудалил большую часть его для удобства чтения): lt_jwt eyJ0eX[...]SkRNZyJ9.eyJnaXZ[...]kzNDV9.d3Tzr[...]NzbA staging-auth0-login.scapp.io / 9/13/2018, 1:55:45 PM 1.03 KB

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

Вот пример конфигурации NGINX, где я настраиваю аутентификацию:

location = /dashboard {
    auth_jwt_key "AUTH0_CLIENT_SECRET";
    auth_jwt $cookie_lt_jwt;

    root /usr/src/lt/nginx;
    try_files /dashboard.html =404;
}

По сути, я никогда не вижу dashboard.html и всегда получаю 401 unauthorized.NGINX error.log показывает, что декодирование JWT не удалось: [warn] 64#64: *23 JWT: failed to parse jwt, что в данном случае является журналом ошибок из используемого мной пользовательского модуля nginx:

// Validate the jwt
if (jwt_decode(&jwt, jwt_data, conf->jwt_key.data, conf->jwt_key.len))
{
  ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, "JWT: failed to parse jwt");
  return NGX_HTTP_UNAUTHORIZED;
}

Ссылка: https://github.com/maxx-t/nginx-jwt-module/blob/d9a2ece81ca66647f81fc2586b29b348af67f8aa/src/ngx_http_auth_jwt_module.c#L124

К сожалению, отладить его не так просто, но я получил аналогичный ответ от другого пользовательского модуля NGINX, который я также протестировал: jwt_verify: error on decode: SUCCESS, который является результатом этого сегмента кода:

  jwt_t* token;
  int err = jwt_decode(&token, token_data, alcf->key.data, alcf->key.len);
  if (err) {
    ngx_log_error(NGX_LOG_ERR, r->connection->log, errno,
                  "jwt_verify: error on decode: %s", strerror(errno));
    return ngx_http_auth_jwt_set_realm(r, &alcf->realm);
  }

Ссылка: https://github.com/tizpuppi/ngx_http_auth_jwt_module/blob/bf8ae5fd4b8e981b7683990378356181dee93842/ngx_http_auth_jwt_module.c#L247

Таким образом, в обоих случаях вызывается jwt_decode и происходит сбой (хотя код ошибки, по-видимому, SUCCESS).

Причина, по которой я спрашиваю здесь, заключается в том, что ячувствую, что здесь я могу сделать что-то концептуально неправильное:

  1. форматирование файла cookie (я видел, что файлы cookie jwt выглядят так: Bearer eyJ0eX[...]SkRNZyJ9.eyJnaXZ[...]kzNDV9.d3Tzr[...]NzbA
  2. при условии, что можно использовать токен, созданный auth0вот так
  3. ...?

Пожалуйста, дайте мне знать, если у вас есть понимание или хороший пример работы с NGINX + auth0. Я читал эту статью https://auth0.com/blog/use-nginx-plus-and-auth0-to-authenticate-api-clients/автор auth0 подробно описывает, как очень похожий модуль NGINX ProБудет использоваться, но у меня нет доступа к этому коммерческому модулю.

1 Ответ

0 голосов
/ 13 сентября 2018

Чтобы ответить на главный вопрос: cookie должен действительно содержать только JWT без префикса.Код Python (фляга) в вопросе не делает ничего плохого, и я смог подтвердить с помощью curl, что вы действительно можете получить авторизацию (с действующим JWT), хранящимся в cookie:

curl https://some.page.com/application --cookie "lt_jwt=eyJ0eX[...]SkRNZyJ9.eyJnaXZ[...]kzNDV9.d3Tzr[...]NzbA"

Так в чем здесь проблема - почему я не могу аутентифицироваться в браузере, когда он работает через curl?

Причина была в конфигурации NGINX, которая требовала отключить аутентификацию в http контекст.По сути, это была ошибка в модуле NGINX, которую разработчик сумел исправить с тех пор.

Извлеченный урок: обычно это не ваша ошибка;)

...