0

我已为我的 Blazor WASM 应用配置了外部提供者身份验证。用户可以选择通过 Spotify 帐户登录,然后,我希望我的服务器从 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;
                };
            });

为了调用 Spotify API,我需要一个访问令牌。如果我理解正确,令牌会在用户登录后提供给我的服务器。在上面的代码中,我已经指定OnCreatingTicket了事件,我可以看到它正在被触发(就在我登录之后)并且access_tokentokens列表中。

现在,问题是,我不知道以后如何检索该令牌。

以下是登录后发生的情况:

  1. 用户导航到\LikedSongs(用于显示数据的 blazor wasm 子页面)
  2. Blazor 页面调用我的服务器的 API 来检索稍后将显示的数据
protected override async Task OnInitializedAsync()
{
    savedTracks = await HttpClient.GetFromJsonAsync<SavedTrack[]>("UsersTracks");
}
  1. 最后,我的 API 控制器被触发:
[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
}

出于某种原因,token为空。而且我在 HttpContext 中找不到任何其他标记。正如我正确理解的那样,令牌是在 cookie 中编码的,那么为什么我在那里找不到它们呢?

4

0 回答 0