使用JwtSecurityToken配合HttpClient发起OpenApi鉴权请求的问题
问题根因及解决方案
你遇到的403问题核心是参数类型使用错误,接口的Bearer认证仅要求传入原始的三段式JWT字符串,不需要额外做Base64/URL编码操作,原始JWT本身已经是URL安全的编码格式,额外编码反而会导致服务端解析失败。
两种可用实现方案
- 方案1:调整方法入参,直接传入原始JWT字符串
你之前传给ValidateCurrentToken方法的string类型token就是可以直接使用的原始串,修改代码如下:// 将入参从JwtSecurityToken改为原始token字符串 public async Task<HttpResponseMessage> GetResponse(HttpClient httpClient, Uri uri, string rawToken) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(); // 直接传入原始token即可,无需额外处理 httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", rawToken); httpRequestMessage.Method = HttpMethod.Get; httpRequestMessage.RequestUri = uri; return await httpClient.SendAsync(httpRequestMessage); } - 方案2:保留现有入参,调用
RawData属性获取原始串
如果你不能修改方法入参结构,直接取JwtSecurityToken对象自带的RawData属性即可获取原始JWT字符串:public async Task<HttpResponseMessage> GetResponse(HttpClient httpClient, Uri uri, JwtSecurityToken token) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(); // RawData属性存储的就是未做任何修改的原始三段式JWT串 httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.RawData); httpRequestMessage.Method = HttpMethod.Get; httpRequestMessage.RequestUri = uri; return await httpClient.SendAsync(httpRequestMessage); }
校验小技巧:如果修改后依然报错,可以把生成的Authorization头完整值打印出来,和你本地校验用的原始token做对比,排查是否存在多余空格、特殊字符转义的问题。
内容的提问来源于stack exchange,提问作者evilfish
相关产品推荐
相关产品推荐

