We are developing a library for our company's other teams. I'd like to design an Authentication interface, if the user of our library implement that interface in their project, then we will use their implementation (probably through reflection) to do the authentication. If there is no implementation then we will ignore this part.
The reason we do like this vs. providing method to register their auth class is we don't expose these kind of high level function to the project team. They will mostly work on the business logic part.