我已为我的 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_token
在tokens
列表中。
现在,问题是,我不知道以后如何检索该令牌。
以下是登录后发生的情况:
- 用户导航到
\LikedSongs
(用于显示数据的 blazor wasm 子页面) - Blazor 页面调用我的服务器的 API 来检索稍后将显示的数据
protected override async Task OnInitializedAsync()
{
savedTracks = await HttpClient.GetFromJsonAsync<SavedTrack[]>("UsersTracks");
}
- 最后,我的 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 中编码的,那么为什么我在那里找不到它们呢?