在我的 React 应用程序中,我正在GET对一个端点进行REST Web 服务调用,其目的是为受保护的 S3 资产生成一个预签名的 AWS URL。我们将Authorization标头和令牌传递给服务。
此初始调用按预期工作,服务以重定向(通过 307 响应代码)进行响应,并在响应的Location标头中包含预签名 URL 。
我面临的问题是,当遵循重定向时,亚马逊拒绝使用 400 响应代码和以下消息的呼叫。
Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified.
Run Code Online (Sandbox Code Playgroud)
有没有办法Authorization在重定向之前删除标题?
这似乎应该是一种相当普遍的情况(当 React 应用程序需要访问受保护的 S3 资产时)——有没有更好的方法来处理这个用例?
HttpClient我想通过我自己的 C# API向外部 API 发送请求。我正在使用 dot net 5 和基本身份验证。这是我的代码:
var client = new HttpClient
{
BaseAddress = new Uri(baseUrl)
};
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put, "apiUrl");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var param = JsonConvert.SerializeObject(new
{
param1="",
param2=""
});
requestMessage.Content = new StringContent(param, Encoding.UTF8, "application/json");
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{pass}")));
HttpResponseMessage response = await client.SendAsync(requestMessage);
Run Code Online (Sandbox Code Playgroud)
通常,我像这样发送http请求。但现在我遇到了一些问题。
从我的请求标头中删除行授权标头后HttpResponseMessage response = await client.SendAsync(requestMessage);,我收到 UnAuthorized http 错误。
我知道,当发生重定向时,出于安全原因,授权标头被删除。我也不确定外部 API 中的重定向。
我将HttpClientHandlerwith添加AllowAutoRedirect = false到我的HttpClient
var handler = new HttpClientHandler() …Run Code Online (Sandbox Code Playgroud) c# httpclient unauthorized basic-authentication www-authenticate
我们有一项服务,可将用户重定向到 S3 存储桶中的对象。该请求的身份验证存储在 URL 的查询部分。
我知道规范没有指定在重定向的情况下要对请求标头做什么,但是我看到的实现将Authorization在使用 HTTP Basic 时去除标头。
有趣的是,当我们通过 HTTP 基本身份验证调用我们的服务时,它工作正常。客户端Authorization从请求中去除标头,文件从 S3 传送。
但是当我们使用 OAuth 不记名令牌调用我们的服务时,Authorization标头会留在重定向中,导致 S3 返回400错误响应。
服务器的重定向响应有没有办法指示客户端Authorization在访问响应的Location标头之前去除标头?
我正在使用 RestSharp 进行 GET api 调用。api 调用通过传递授权标头通过 HTTP 基本身份验证进行身份验证。
服务器使用状态代码 307 重定向 api 调用。我的客户端代码确实处理重定向,但授权标头未传递到此重定向的 api 调用。这样做是出于此处提到的正当理由。因此我确实收到了未经授权的错误。
如何配置 RestClient 来恢复授权标头?
var client = new RestClient("https://serverurl.com");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Basic Z3JvdXAxOlByb2otMzI1");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Tenant-Id", "4892");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Run Code Online (Sandbox Code Playgroud) 我正在使用django-rest-framework. 对于授权,我选择使用令牌授权(而不是 JWT)。以下是我尝试过的:
使用邮递员(作品)
headers:
Authorization: Token 329367424fd30a876ccff05dbc5a18d86fe7158c
Run Code Online (Sandbox Code Playgroud)
使用 C# 客户端(不起作用)
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Token 329367424fd30a876ccff05dbc5a18d86fe7158c");
await client.GetAsync(<url>)
// Authentication credentials were not provided.
Run Code Online (Sandbox Code Playgroud)
在我调试和覆盖TokenAuthentication函数后,我意识到Authorization headers如果客户端请求,该函数将被删除C#。
编辑:
实际上我尝试过使用 Javascript 并且它也有效,我认为问题是 C# HttpClient。
我试过
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization3", $"token {token}");
client.DefaultRequestHeaders.Add("Authorization", $"token {token}");
Run Code Online (Sandbox Code Playgroud)
我Authorization在 python 中调试函数,我发现只Authorization3发送到服务器而Authorization不是