Try setting the sasl_allowed_mechs in your connection options.  I believe
it is defaulting to ANONYMOUS, which does not use the user/password
values.  Try using "PLAIN".  Whatever you use must match what is supported
on the broker-side.

-Ted

On Mon, May 5, 2025 at 3:37 PM peter.j.rich...@lmco.com <
peter.j.rich...@lmco.com> wrote:

> Hi, I'm using version 0.37.0 of the C++ library (qpid-proton-cpp-0.37.0)
> and can't figure out how to authenticate with a username/password. My test
> setup:
>
> For the broker, I run ActiveMQ Classic using this command: podman run -it
> --rm --net=host --env ACTIVEMQ_CONNECTION_USER=admin --env
> ACTIVEMQ_CONNECTION_PASSWORD=admin docker.io/apache/activemq-classic
>
> For the C++ client, I run the code from the "simple_send.cpp" example at
> https://qpid.apache.org/releases/qpid-proton-0.37.0/proton/cpp/api/simple_send_8cpp-example.html,
> which I simplified to hardcode the username/password to admin/admin:
>
> #include <proton/connection.hpp>
> #include <proton/connection_options.hpp>
> #include <proton/container.hpp>
> #include <proton/message.hpp>
> #include <proton/message_id.hpp>
> #include <proton/messaging_handler.hpp>
> #include <proton/reconnect_options.hpp>
> #include <proton/tracker.hpp>
> #include <proton/types.hpp>
>
> #include <iostream>
> #include <map>
>
>
> class simple_send : public proton::messaging_handler {
>   private:
>     std::string url;
>     std::string user;
>     std::string password;
>     bool reconnect;
>     proton::sender sender;
>     int sent;
>     int confirmed;
>     int total;
>
>   public:
>     simple_send(const std::string &s, const std::string &u, const
> std::string &p, bool r, int c) :
>         url(s), user(u), password(p), reconnect(r), sent(0), confirmed(0),
> total(c) {}
>
>     void on_container_start(proton::container &c) override {
>         proton::connection_options co;
>         if (!user.empty()) co.user(user);
>         if (!password.empty()) co.password(password);
>         if (reconnect) co.reconnect(proton::reconnect_options());
>         sender = c.open_sender(url, co);
>     }
>
>     void on_connection_open(proton::connection& c) override {
>         if (c.reconnected()) {
>             sent = confirmed;   // Re-send unconfirmed messages after a
> reconnect
>         }
>     }
>
>     void on_sendable(proton::sender &s) override {
>         while (s.credit() && sent < total) {
>             proton::message msg;
>             std::map<std::string, int> m;
>             m["sequence"] = sent + 1;
>
>             msg.id(sent + 1);
>             msg.body(m);
>
>             s.send(msg);
>             sent++;
>         }
>     }
>
>     void on_tracker_accept(proton::tracker &t) override {
>         confirmed++;
>
>         if (confirmed == total) {
>             std::cout << "all messages confirmed" << std::endl;
>             t.connection().close();
>         }
>     }
>
>     void on_transport_close(proton::transport &) override {
>         sent = confirmed;
>     }
> };
>
> int main(int argc, char **argv) {
>     std::string address = "127.0.0.1:5672/examples";
>     std::string user = "admin";
>     std::string password = "admin";
>     bool reconnect = false;
>     int message_count = 100;
>
>     try {
>         simple_send send(address, user, password, reconnect,
> message_count);
>         proton::container(send).run();
>
>         return 0;
>     } catch (const std::exception& e) {
>         std::cerr << e.what() << std::endl;
>     }
>
>     return 1;
> }
>
> When run, the C++ client crashes with this error:
>
> amqp:unauthorized-access: Authentication failed [mech=ANONYMOUS]
>
> The error message suggests (?) that the username/password I specify are
> not being used, since it says "mech=ANONYMOUS". Can anyone see an obvious
> mistake in my C++ code? Am I not setting the username/password correctly?
> Is this a known bug in version 0.37.0?
>
> In contrast, I can successfully authenticate to the broker using the C#
> library example at
> https://docs.redhat.com/en/documentation/red_hat_build_of_apache_qpid_proton_dotnet/1.0/html-single/using_qpid_proton_dotnet/index.
> In the C# example, if I specify the username/password as admin/admin then
> message posting succeeds, and when I specify a wrong password it fails with
> an authentication error.
>
>

Reply via email to