How to retrieve AuthenticationToken while processing API request?

245 views Asked by At

I've configured External provider authentication to my Blazor WASM app. User can choose to log in via Spotify account and after that, I want my server to download some data about him from Spotify API.

services.AddAuthentication()
            .AddIdentityServerJwt()
            .AddSpotify(options =>
            {
                options.ClientId = "clientid";
                options.ClientSecret = "secret";
                options.CallbackPath = "/signin-spotify";
                options.SaveTokens = true;

                var scopes = new List<string> {
                    //scopes
                  };
                options.Scope.Add(string.Join(",", scopes));
                options.Events.OnCreatingTicket = ctx =>
                {
                    List<AuthenticationToken> tokens = ctx.Properties.GetTokens().ToList();

                    tokens.Add(new AuthenticationToken()
                    {
                        Name = "TicketCreated",
                        Value = DateTime.UtcNow.ToString()
                    });

                    ctx.Properties.StoreTokens(tokens);
                    ctx.Properties.IsPersistent = true;

                    return Task.CompletedTask;
                };
            });

In order to call Spotify API, I need an access token. Token is, if I understand correctly, given to my server after user logs in. In above code, I've specified OnCreatingTicket event and I can see it is being fired (just after I log in) and access_token is in tokens list.

Now, the problem is, I don't know how to retrieve that token later.

Here is what happens after log in:

  1. User navigates to \LikedSongs (blazor wasm subpage that is meant to display data)
  2. Blazor page calls my server's API to retrieve data that will be later displayed
protected override async Task OnInitializedAsync()
{
    savedTracks = await HttpClient.GetFromJsonAsync<SavedTrack[]>("UsersTracks");
}
  1. Finally, my API controller is being fired:
[HttpGet]
public async Task<IEnumerable<SavedTrack>> GetAsync()
{
    // here I need to have access_token
    // ASP.net MVC tutorial I follow states, that below line should work
    var token = await _httpContextAccessor.HttpContext.GetTokenAsync("Spotify", "access_token");
    
    // unfortunately token == null
}

For some reason, token is null. And I can't find any other tokens in HttpContext. As I understand correctly, tokens are encoded in cookies, so why I can't find any of them there?

0

There are 0 answers