向标头添加授权

时间:2013-09-26 21:58:14

标签: c# windows-phone-8 async-await dotnet-httpclient

我有以下代码:

...
AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue("OAuth2", Contract.AccessToken);
string result = await PostRequest.AuthenticatedGetData(fullUrl, null, authHeaders);
return result; 
...

public static async Task<string> AuthenticatedGetData(string url, FormUrlEncodedContent data, AuthenticationHeaderValue authValue)
{

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authValue.Parameter);

    HttpResponseMessage response = await client.PostAsync(new Uri(url), data);

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();
    return responseBody;
}

响应=等待部分只是继续循环,没有任何反应。我有什么想法吗?

问题是,如何发送以下标题:

Authorization: OAuth2 ACCESS_TOKEN

到外部网络api

5 个答案:

答案 0 :(得分:55)

我为此苦苦挣扎。我一直收到一条错误说&#34;格式无效&#34;因为我有一个自定义实现,并且Authorization标头根据某些标准进行了验证。然而,以这种方式添加标题有效:

var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");

答案 1 :(得分:19)

这一行

client.DefaultRequestHeaders.Authorization = 
           new AuthenticationHeaderValue(authValue.Parameter);

将生成此标头值

Authorization: ACCESS_TOKEN

其中ACCESS_TOKENauthValue.Parameter的值。您想要分配您传递的值以获取所需的标题

client.DefaultRequestHeaders.Authorization = authValue;

将产生

Authorization: OAuth2 ACCESS_TOKEN

答案 2 :(得分:5)

在获取AuthenticationHeaderValue以处理我的请求时遇到类似问题。 我也在使用GitHub的JWT JsonWebToken。 我能够从API获取令牌,但在其他GET和POST中很难使用它。

var jwt = JsonWebToken.Encode(token, APISECRET, JwtHashAlgorithm.HS256);
var tk = GetTokenFromApi(); // basically returns an encrypted string.

手动使用WebRequest: 哪个工作正常。

request.ContentType = "application/json";
request.Method = "POST";
request.Headers.Set("Authorization", string.Format("Bearer {0}", tk));

当我们切换到HttpClient并使用AuthenticationHeaderValue时,无法弄清楚如何正确设置它。查看请求字符串后,我看到它添加了&#34;授权&#34;为了我。玩弄参数,这最终有效。

 var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk);

答案 3 :(得分:1)

在您的代码中,您正在执行以下操作:

import 'react-native-gesture-handler';
import React from 'react';
import Navigation from './src/config/navigation';
import useLocalStorage from './src/hooks/useLocalStorage';

export default () => {
  const [readData] = useLocalStorage();

  React.useEffect(() => {
    readData('@selected_language');
    console.log('read data useEffect is running');
  }, []);

  return <Navigation />;
};

我认为以下内容应该以相同的方式工作,而无需使用字符串插值:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");

这是因为字符串插值只是生成一个带有令牌的字符串!

答案 4 :(得分:0)

也许会吸引其他人。自从我搜索了很长时间以来。但是,您还必须保存cookie,并在下一个请求中提供它。首先,这是我获取身份验证代码并将Cookie保持在静态变量中的方式(在我第一次调用此方法时,我给令牌赋予了空值)。

    public static CookieContainer CookieContainer;
    public static async Task<string> Post<TRequest>( TRequest requestBody, string path, string token = "")
    {
        var baseUrl = new Uri($"urlFromApi");
        CookieContainer = new CookieContainer();
        using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
            using(var client = new HttpClient(handler){BaseAddress = baseUrl})
        {
            client.DefaultRequestHeaders.ConnectionClose = false;
            if (!string.IsNullOrWhiteSpace(token))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            }
            ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute            using (var content = new ByteArrayContent(GetByteData(requestBody)))
            using (var content = new ByteArrayContent(GetByteData(requestBody)))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(String.Empty, content);
                return await GetResponseContent(response);
            }
        }

    }

此后,如果我对ap​​i提出任何请求,则包括cookie(令牌是您从第一个响应中得到的结果)   公共静态异步任务Get(字符串路径,字符串标记=“”)         {

        var baseUrl = $"https://innoviris-ai.collibra.com/rest/2.0{path}";
        using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
        using (var client = new HttpClient(handler) {BaseAddress = new Uri(baseUrl)})
        {
            client.DefaultRequestHeaders.ConnectionClose = false;
            if (!string.IsNullOrWhiteSpace(token))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            }
            ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute     

            var response = await client.GetAsync(String.Empty);
            return await GetResponseContent(response);
        }
    }