#javascript #websocket #rabbitmq #jwt
#javascript #websocket #rabbitmq #jwt
Вопрос:
Это моя текущая настройка RabbitMQ / Stomp, которая отлично работает с аутентификацией по имени пользователя и паролю.
Моя конечная цель — передать JWT вместо имени пользователя и пароля. У меня уже есть доступ к токену на интерфейсе, и я не хочу использовать сервер UAA. Я добавил этот плагин в RabbitMQ и попытался выполнить то, что указано в шаге 3 потока авторизации, но безуспешно.
Клиент передает токен в качестве пароля при подключении к узлу RabbitMQ. Поле имени пользователя игнорируется.
Я получаю следующую ошибку:
<<< ERROR
content-length:16
version:1.0,1.1,1.2
content-type:text/plain
message:Processing error
content-length:16
Редактировать
Другое наблюдение заключается в том, что после добавления «Authorization: Bearer» перед токеном я получаю новую ошибку.
<<< ERROR
content-length:33
version:1.0,1.1,1.2
content-type:text/plain
message:Bad CONNECT
content-length:33
Access refused for user 'rabbit'
Настройка RabbitMQ
Docker
FROM rabbitmq
RUN rabbitmq-plugins enable --offline rabbitmq_management
RUN rabbitmq-plugins enable --offline rabbitmq_stomp
RUN rabbitmq-plugins enable --offline rabbitmq_web_stomp
RUN rabbitmq-plugins enable --offline rabbitmq_auth_backend_oauth2
COPY ./advanced.config /etc/rabbitmq/advanced.config
COPY ./rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
EXPOSE 15671 15672 15674 61613
advanced.config
[
{rabbit, [
{default_user, <<"admin">>},
{default_pass, <<"guest">>},
{auth_backends, [rabbit_auth_backend_oauth2, rabbit_auth_backend_internal]}
]},
{rabbitmq_management, [
{enable_uaa, false}
]},
{rabbitmq_auth_backend_oauth2, [
{resource_server_id, <<"rabbitmq">>},
{key_config, [
{default_key, <<"key-1">>},
{signing_keys,
#{<<"key-1">> => {pem, <<"-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr8xZBLjW7yMZJobc/IFo
6New9jlCvSx8I6aSBrU EU TN6iXF13Tqqp62L/TWlTrYlErsu2yvLknhN4VU7qX
g38/2wZn9/kKFYCkeaDe3lDxl 4rNGq1TSEXCzndIDfVzgxZvKZ0Vt5 mvr1cxR7
7V6MFcJvIHMv4MdIqAUwABFFHvonp56yzh7g/UsAk6XlaqhoZQ1NrPyWpG6YgHwg
hFibyh0ZI3gD7H0UshpR9VVPLTgrAUnf3qWMpEXKO2ePmrTVwwDpL25n5DdhaBz6
e YSonTT7KigxeklRPrKc7km29l0frml 8jOsQsx7L2WCD/HqR6J5iVDZ5mDfeKN
vcixi nkLTCyV1jsHEzteSmGgmAE6SrSMXV oPz2xLGKEGJJQWS Ll1l5BD1MmZE
6DqLoe8FHew54M7zniCxkhDIHcpVY3IYcv2gohhaxm9MHkSHaj6bwAGQcORwgGho
ETVr7RXyvCD5Vsr6VqDqknjleP1tLi/gnlzP099SLmGiB6y/v1mW1s3tDpI/F7b7
WWDyHRqW9YfGEPYOmNdELcizW9UxY2MFvK4LlacRaXzzDEXmiP/FK84Qse14Nmyi
6tfqIYe PRWbA7ztOaBlmDnkhxHcLufB48t4dleUWmj 6VOXQGXef10p4rQNeOo5
N5dJoYqveUJ6Lfln3C25NJcCAwEAAQ==
-----END PUBLIC KEY-----">>}
}
}]
}
]}
].
rabbitmq.conf
loopback_users.guest = false
total_memory_available_override_value = 2684354560
listeners.tcp.default = 5672
management.tcp.port = 15672
web_stomp.ws_frame = binary
Текущая настройка клиента Stomp
var client = new StompJs.Client({
brokerURL: 'ws://localhost:5900/ws',
connectHeaders: {
login: 'admin',
passcode: 'guest'
},
debug: log => (
console.log(
log
)
),
reconnectDelay: 5 * 1000,
heartbeatIncoming: 4 * 1000,
heartbeatOutgoing: 4 * 1000,
});
Идеальная настройка JWT
var client = new StompJs.Client({
brokerURL: 'ws://localhost:5900/ws',
connectHeaders: {
login: 'rabbit',
passcode: 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc0FjdGl2ZSI6dHJ1ZSwiX2lkIjoiNWZkNzc0MDY4NzE3NTU2OWFlMTIxNmRmIiwiY29kZSI6IjIwMDAwMDEwNiIsInVzZXJuYW1lIjoiYW50b25pc2NvZGV1cCIsImVtYWlsIjoiYW50b25pc0Bjb2RldXAuc29mdHdhcmUiLCJmaXJzdE5hbWUiOiJBbnRvbmlzIiwibGFzdE5hbWUiOiJQaXNoaWFzIiwib3JnYW5pc2F0aW9uIjoiQ29kZVVwIFNvZnR3YXJlIEx0ZCIsInJvbGUiOnsiX2lkIjoiNWZkMmEyM2VjOTJmOTFjNTFkOTIzMTZiIiwibmFtZSI6ImN1c3RvbWVyIiwicmVhZCI6W3siX2lkIjoiNWZkMmEyM2VjOTJmOTFjNTFkOTIzMTViIiwibmFtZSI6ImFjY291bnRzIn0seyJfaWQiOiI1ZmQyYTIzZWM5MmY5MWM1MWQ5MjMxNWMiLCJuYW1lIjoiY3JtIn0seyJfaWQiOiI1ZmQyYTIzZWM5MmY5MWM1MWQ5MjMxNWQiLCJuYW1lIjoid2FyZWhvdXNlIn1dLCJjcmVhdGUiOltdLCJ1cGRhdGUiOltdLCJtb3ZlIjpbXSwiX192IjowfSwiX192Ijo3LCJzY29wZXMiOlsicmFiYml0bXEuY29uZmlndXJlOiovKiIsInJhYmJpdG1xLndyaXRlOiovKiIsInJhYmJpdG1xLnJlYWQ6Ki8qIl0sImlhdCI6MTYwNzk1NjkzNCwiZXhwIjoxNjA4NTYxNzM0LCJhdWQiOlsiaHR0cHM6Ly9iaXpjb3VyaWVyLmV1IiwicmFiYml0bXEiXSwiaXNzIjoiaHR0cHM6Ly9yZXN0LmJpemNvdXJpZXIuZXUifQ.Ypqa16YuqH3rfwxAQZ_RdJRF21h6jYX07r-zaB3AP_qshU_xBiP9RpFvFkws13i0_X3Ou-qKxSdAF51T1t-Ob5V4LiXLJKsesmZIeIGXs-Dhc79u5UqhOdGIzPgRTlieOIUmrFKsPBWf7FnoR-lgd9gH8ge3Wp2f2vOqU24JsEjkvtlTGLS1aId27UVz0d2qxMLWf-9kLxW4mmuM2UCeRsnznpPaZbAfhq2tHHIy3EtGeIIiOsAE0lM9BfJRF36kjZcpcMZSnhTrkZjiDsrUuiVd-W27MVJRYFVpULkGrpa5RkkDG5ZbwNNSn0VUMZB2PiQTchtNyoffutPzhktxieDO5T0OzrSXl5VAtgZFHi5oPLWtPGVejNiWMFsY9u1ale6NRDSReeQjPPEqzpH-tfnugkwyv_jhL6WnfmoeEBgcuyK7eBvrg7uJbQFdwMrRQXkGn_ATn0XhJWI-Hia3muNbNbvdL0jgkZBv0HFPsx84n3-IEx672_6Wy2qtLtFcnUgGr4ThRVp8PE0ro21JdvjFbwgq9k5Qhv5MA6wgB6nt7vtuP1SZ17ekIPE6izwHUPZsWsqJg6v108H1B13J2yxK5LcdsCb8Z8uRhiRSKt4Cs6MHsZg0GCOjym2YHXyN21Wpw3behq0GxUiSrU4qkADujDb6nNzaLq2_ecn5bOI'
},
debug: log => (
console.log(
log
)
),
reconnectDelay: 5 * 1000,
heartbeatIncoming: 4 * 1000,
heartbeatOutgoing: 4 * 1000,
});
Вы можете расшифровать JWT здесь
Ответ №1:
Я думаю, что вам не хватает области в вашем JWT
Смотрите документацию здесь: https://github.com/rabbitmq/rabbitmq-server/tree/master/deps/rabbitmq_auth_backend_oauth2
В нем говорится:
Область действия токена, возвращаемая поставщиком OAuth 2.0, должна включать области ресурсов RabbitMQ, которые соответствуют соглашению, используемому этим плагином: configure://foo означает «настроить разрешения для ‘foo’ в vhost ‘/'») (поле области действия можно изменить с помощью extra_scopes_source в файле advanced.config.
(Кстати: я также не смог найти «extra_scopes_source» в вашем advanced.config)
Хотя я не тестировал это, непредоставление области логически приведет к ошибке отказа в доступе.