Authentication methods in Best MQTT.

Username + Password Authentication

Username and password can be added to the connect packet through the ConnectPacketBuilder:

var options = new ConnectionOptionsBuilder()
        .WithTCP("test.mosquitto.org", 1884)
        .Build();
client = new MQTTClient(options);
client.BeginConnect(ConnectPacketBuilderCallback);

private ConnectPacketBuilder ConnectPacketBuilderCallback(MQTTClient client, ConnectPacketBuilder builder)
{
	// Add username and password to the connect packet
    return builder.WithUserNameAndPassword("rw", "readwrite");
}

For those cases where only the username or password needed, the .WithUserName and .WithPassword functions can be used.

Extended Authentication

With MQTT v5 there are two new functions available to do authentication in the ConnectPacketBuilder, WithExtendedAuthenticationMethod and WithExtendedAuthenticationData:

private ConnectPacketBuilder ConnectPacketBuilderCallback(MQTTClient client, ConnectPacketBuilder builder)
{
    string token = "<token>";
    return builder
        .WithExtendedAuthenticationMethod("Bearer")
        .WithExtendedAuthenticationData(System.Text.Encoding.UTF8.GetBytes(token));
}

After a successful connection the server might send a re-authentication request that can be handled by subscribing to the OnAuthenticationMessage.

client = new MQTTClientBuilder()
	.WithOptions(options)
	.WithEventHandler(OnAuthenticationCallback)
	.CreateClient();
	
private void OnAuthenticationCallback(MQTTClient client, AuthenticationMessage message)
{
    switch (message.ReasonCode)
    {
        // Successfully authenticated
        case AuthReasonCodes.Success: 
			break;

        // Server requires re-authentication of the client.
        case AuthReasonCodes.ReAuthenticate:
            string token = "<new token>";

            client.CreateAuthenticationPacketBuilder()
                .WithReasonCode(AuthReasonCodes.ContinueAuthentication)
                .WithAuthenticationMethod("Bearer")
                .WithAuthenticationData(System.Text.Encoding.UTF8.GetBytes(token))
                .BeginAuthenticate();
            break;

        // Server needs more data
        case AuthReasonCodes.ContinueAuthentication:
            break;
    }
}