【问题标题】:How to send an access_token and id_token to an api using System.Net.Http如何使用 System.Net.Http 将 access_token 和 id_token 发送到 api
【发布时间】:2017-08-21 19:44:37
【问题描述】:

如何使用 System.Net.Http 将 access_token 和 id_token 发送到您的 api?当我用邮递员测试我的 api 时,它似乎发送了两个令牌并返回了我需要的个人用户信息(用户正在销售的产品列表)。我不确定如何在我的 Xamarin 应用程序中做到这一点,并且已经被困了很长一段时间。我可以发送 access_token ,如下所示,但是我在发送两个令牌时尝试过的任何操作都返回了 404 not found。 (未授权已更正为 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 获取用户信息是有意义的。

【问题讨论】:

    标签: c# xamarin xamarin.android jwt


    【解决方案1】:

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

    您的意思是“访问密钥和秘密”吗?或者你确定你有一个access_token?

    在前一种情况下,通常 API 会期望如下:

    • 将密钥和秘密附加在一起,用“:”分隔
    • 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,则此设置更加简单。

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2018-08-11
      • 2022-08-10
      • 2016-10-26
      • 1970-01-01
      • 2019-10-15
      • 2018-03-22
      • 2021-12-23
      • 2022-11-05
      相关资源
      最近更新 更多