Я использовал 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
).
Причина, по которой я спрашиваю здесь, заключается в том, что ячувствую, что здесь я могу сделать что-то концептуально неправильное:
- форматирование файла cookie (я видел, что файлы cookie jwt выглядят так:
Bearer eyJ0eX[...]SkRNZyJ9.eyJnaXZ[...]kzNDV9.d3Tzr[...]NzbA
- при условии, что можно использовать токен, созданный auth0вот так
- ...?
Пожалуйста, дайте мне знать, если у вас есть понимание или хороший пример работы с NGINX + auth0. Я читал эту статью https://auth0.com/blog/use-nginx-plus-and-auth0-to-authenticate-api-clients/автор auth0 подробно описывает, как очень похожий модуль NGINX ProБудет использоваться, но у меня нет доступа к этому коммерческому модулю.