Search code examples
c#swaggerbearer-tokenautorest

AutoRest is requiring ServiceClientCredentials in the constructor, but I can't obtain that data without instantiating the client object


I generated an API client with AutoRest and am using the --add-credentials parameter so that I can pass in a bearer token. In order to get the token, I need to be able to instantiate the object and call my login method like this:

var client = new IOIWebAPI(new Uri("https://localhost:44325", UriKind.Absolute));
var loginResult = client.Login(authModel);

The problem is that every constructor requires ServiceClientCredentials. From what I understand, I need to create an instance of TokenCredentials, which includes the token string. But I can't do that because I can't get the token string without calling Login. And I can't call Login without having the token string.

I'm sure I'm just misunderstanding how to consume the API client. But any ideas on what I'm doing wrong here?


Solution

  • My best guess is that --add-credentials does not support unauthenticated endpoints. When you add creds, AutoRest assumes everything needs auth. I submitted an issue for this, but I suspect it won't be addressed any time soon.

    My workaround was to create a TokenHelper class. I copy and pasted the code that AutoRest generated from my login endpoint into that class. So the code stays consistent, but it's not ideal because I may forget to update the endpoint if it ever changes.

    var tokenHelper = new TokenHelper(baseUri);
    var tokenResult = tokenHelper.GetTokenAsync(authModel).GetAwaiter().GetResult();
    
    var token = new TokenCredentials(tokenResult.AccessToken, "Bearer");
    var client = new IOIWebAPI(baseUri, token);