使用HttpClient调用connect/token换令牌遇授权码缺失错误排查
问题原因及解决办法
核心问题:参数键的多余空格
你代码里的参数字典中,"code "这个键后面多了一个空格:
{ "code ", code },
认证服务(比如IdentityServer)只认无空格的code作为授权码参数的键,带空格的code 会被当成无关参数,所以服务端找不到有效的授权码,才会抛出“Authorization code is missing”错误。看日志里的Raw部分也能明确看到这个带空格的键:"code ": "8265CBAE...",这就是问题根源。
日志里的RefreshToken显示无需在意
日志里出现的RefreshToken: "********"是服务端日志模板的默认字段,你用的是authorization_code授权类型,实际并没有传refresh_token,属于日志误显示,不用处理。
修复后的代码
把code参数键的空格去掉即可:
private void GetToken(string code) { Dictionary<string, string> parameters = new Dictionary<string, string> { { "client_id", "my_client" }, { "grant_type", "authorization_code" }, { "code", code }, // 移除了键名后的空格 { "code_verifier", _code_verifier }, { "redirect_uri", "http://localhost:7920/callback" } }; FormUrlEncodedContent urlEncodedParameters = new FormUrlEncodedContent(parameters); using (HttpClient httpClient = new HttpClient()) { string credential = $"{UrlEncode("my_client")}:{UrlEncode(string.Empty)}"; string foo = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(credential)); httpClient.DefaultRequestHeaders.Add("Authorization", "Basic " + foo); HttpResponseMessage msg = httpClient.PostAsync("https://localhost:5000/connect/token", urlEncodedParameters).Result; } }
另外注意:你手动请求里的client_id是my_client,但IdentityModel示例里是truth_lite_adviser,如果这不是笔误,要确保和认证服务配置的客户端ID一致,避免后续出现其他问题。
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

