如何使用System.Net.Http将access_token和id_token发送到api

时间:2017-08-21 11:02:58

标签: c# xamarin xamarin.android jwt

如何使用System.Net.Http将access_token和id_token发送到api?当我用邮递员测试我的api时,似乎发送了两个令牌并返回了我需要的个人用户信息(用户销售的产品列表)。我不确定如何在我的Xamarin应用程序中执行此操作,并且已经坚持了很长一段时间。我能够发送如下所示的access_token,但是在发送两个令牌时我尝试过的任何内容都返回了404找不到的内容。 (未经授权更正为401,因此access_token仍然有效)

        public async Task<string> GetResponseJsonString(string url)
        {
            string responseJsonString = null;
            var access_token = CrossSecureStorage.Current.GetValue("access_token");           
            using (var httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Clear();
                httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + access_token);
                HttpResponseMessage response = httpClient.GetAsync(url).Result;
                responseJsonString = await response.Content.ReadAsStringAsync();
            }
            return responseJsonString;
        }

注意: 我知道id_token应包含用户信息,应该对其进行解码,而不是发送用户信息请求。我看了这个,并且无法找到适用于xamarin PCL的库。我看着JosePCL.Jwt,却无法让它工作。我认为,因为任何时候我需要用户信息,它都会从我的数据库中返回信息,它有意义地发送带有请求的令牌并让我的api获取用户信息。

1 个答案:

答案 0 :(得分:0)

这完全取决于您调用的API。我从来没有见过一个API,它需要的东西比它提供的access_token更多。你可能在这里有不正确的命名法。

你是说&#34;访问密钥&amp;秘密&#34 ;?或者你确定你有access_token吗?

在前一种情况下,API通常会按照以下方式进行操作:

  • 附加密钥&amp;秘密在一起由&#34;分开:&#34;
  • Base64编码
  • 使用结果
  • 设置Authorization Bearer|Basic标头

如果您尝试将id_token作为Authorization标题传递,还值得一提吗?

同样值得一提的是,您是否可以向我们提供邮递员成功回复的屏幕截图(确保您对敏感数据进行模糊处理)。

同样值得指出代码的优化调整。由于您使用的是async,因此您可能会对性能感到担忧。看看this文章,讨论HttpClient的可处置性。作为更好的选择,请使用HttpRequestMessage,如下所示:

public async Task<string> GetResponseJsonString(string url)
{
    string responseJsonString = null;

    var req = new HttpRequestMessage(HttpMethod.Get, "/your/api/url");             
    req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_token);

    using (var resp = await client.SendAsync(req))
    using (var s = await resp.Content.ReadAsStreamAsync())
    using (var sr = new StreamReader(s))
    {
        if (resp.IsSuccessStatusCode)
        {
            responseJsonString = await sr.ReadToEndAsync();
        }
        else
        {
            string errorMessage = await sr.ReadToEndAsync();
            int statusCode = (int)resp.StatusCode;

            //log your error
        }
    }    

    return responseJsonString;
}

client是对HttpClient的静态共享实例的引用。我做这一切的首选方法是打包我的API调用,通常是每个服务一个文件。我将此服务作为单例注入,它将代理它自己的HttpClient静态实例。如果您正在使用.NET Core,则此设置更加简单。