Hi Ted,
> Try setting the sasl_allowed_mechs in your connection options. Try using
> "PLAIN".
I added this line to on_container_start:
co.sasl_allowed_mechs("PLAIN");
And now I get a different error:
amqp:unauthorized-access: SASL(-4): no mechanism available: No worthy mechs
found (Authentication failed [mech=none])
Any idea why it's ignoring the PLAIN mechanism? I also tried adding these:
co.sasl_enabled(true);
co.sasl_allow_insecure_mechs(true);
But this made no difference (same error).
> Whatever you use must match what is supported on the broker-side.
I believe the broker supports PLAIN, since the C# client library authenticated
fine.
Peter
-----Original Message-----
From: Ted Ross <[email protected]>
Sent: Monday, May 5, 2025 4:48 PM
To: [email protected]
Subject: EXTERNAL: Re: Username/password authentication example from C++ docs
doesn't work?
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 [email protected] <
[email protected]> 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/sim
> ple_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.
>
>