Allow multiple providers, also adding in the provider key & refactoring of token