Я использую механизм кода IBMCloud и пример проекта IBM Code Engine.
У меня возникла проблема с авторизацией при подключении к удаленному серверу IBM MQ из моего приложения Node.js, работающего в контейнере Docker. Несмотря на настройку необходимых переменных и параметров среды, приложение завершает работу с ошибкой:
MQError: OPEN: MQCC = MQCC_FAILED [2] MQRC = MQRC_NOT_AUTHORIZED [2035]
Окружающая среда и настройка:
# Stage 1: Build
FROM ubuntu:20.04 as builder
ENV NODE_VERSION 18
ENV APP_DIR /usr/local/clientapp
WORKDIR ${APP_DIR}
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl gcc g++ make git ca-certificates \
&& curl --silent -k --location https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npm
COPY . ${APP_DIR}
# Install packages for the application
RUN npm install --only=prod \
&& apt-get autoremove -y curl make gcc g++ python3 git \
&& apt-get purge -y \
&& rm -rf /var/lib/apt/lists/* \
&& chmod a+rx ${APP_DIR}/*
# Stage 2: Runtime
FROM node:16-slim as clientAppImage
ENV APP_DIR /usr/local/clientapp
WORKDIR ${APP_DIR}
# Copy built application from the builder stage
COPY --from=builder ${APP_DIR}/ ${APP_DIR}
# Copy the MQ configuration files
COPY ccdt/FOO_BAR.TAB ${APP_DIR}/mqconfig/FOO_BAR.TAB
# Set environment variables for MQ
ENV MQCHLLIB=${APP_DIR}/mqconfig
ENV MQCHLTAB=FOO_BAR.tab
ENV CCDTURL=file://${APP_DIR}/mqconfig/FOO_BAR.tab
EXPOSE 8080
CMD npm start
Фрагмент кода для соединения MQ
// approutes.js
const inboundQueueName = "SOME.INBOUND.QUEUE";
let mqclientInbound = new MQClient(inboundQueueName);
// mqclient.js
constructor(queueName) {
this[_HCONNKEY] = null;
this[_HOBJKEY] = null;
this._queueName = queueName;
}
performConnection() {
return new Promise((resolve, reject) => {
this.buildCNO()
.then((cno) => {
debug_info("CNO Built");
return mq.ConnxPromise(MQDetails.QMGR, cno);
})
.then((hconn) => {
debug_info("Connected to MQ");
this[_HCONNKEY] = hconn;
return this.performOpen();
})
.then((hObj) => {
debug_info("MQ Queue is open");
this[_HOBJKEY] = hObj;
resolve();
})
.catch((err) => {
debug_warn("Error establishing connection to MQ");
debug_warn(err);
reject(err);
});
});
debug_info("Establishing Connection to MQ");
}
performOpen() {
let od = new mq.MQOD();
od.ObjectName = this._queueName;
od.ObjectType = MQC.MQOT_Q;
let openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_BROWSE;
debug_info("Performing open", this[_HCONNKEY]);
return mq.OpenPromise(this[_HCONNKEY], od, openOptions); //<--- FAILING HERE
}
Попытки отладки
Несмотря на эти действия, приложение по-прежнему сталкивается с ошибкой авторизации.
Просьба о помощи:
Любые рекомендации или предложения будут с благодарностью приняты. Спасибо!
Вы устанавливаете csp.UserId
и csp.Password
? Из вашего предыдущего вопроса неясно, нужны они вам или нет.
Администратор очередей удален, и у меня нет к нему доступа. У меня есть доступ только к MQ Client. Есть ли какие-либо журналы клиента MQ, которые могли бы помочь? Я не использую UserId
или Password
, потому что удаленный администратор MQIPT
/MQ Manager
сказал мне, что мне это не нужно. Должен ли я все равно их запрашивать?
@Uhnj Может ли администратор MQ проверить журнал администратора очередей, чтобы помочь в отладке 2035?
Я только что отправил электронное письмо с просьбой сделать это. Я сообщу обновленную информацию, когда получу от них ответ.
Если вы не устанавливаете идентификатор пользователя/пароль, отключите логику, которая это делает cno.SecurityParms = csp;
Если вы не хотите указывать идентификатор пользователя/пароль, вам необходимо отключить следующую логику.
let csp = new mq.MQCSP();
csp.UserId = credentials.USER;
csp.Password = credentials.PASSWORD;
cno.SecurityParms = csp;
Я понял, в чем проблема. параметры let openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_BROWSE;
вызывали проблему с аутентификацией. Как только я сменил его на MQOO_OUTPUT
, я смог нормально подключиться.
Посмотрите ошибки, сгенерированные в AMQERR01.LOG администратора очередей, это покажет причину.