【问题标题】:OAuth 2.0 REST Web API and xamarin formsOAuth 2.0 REST Web API 和 xamarin 表单
【发布时间】:2019-08-29 08:33:32
【问题描述】:

我根据本教程https://www.c-sharpcorner.com/article/asp-net-mvc-oauth-2-0-rest-web-api-authorization-using-database-first-approach/ 制作webservice api,我需要使用服务表单xamarin 表单。但我不知道如何授权客户端。

【问题讨论】:

    标签: c# asp.net xamarin oauth-2.0


    【解决方案1】:

    在您尝试在代码中授权之前,您应该尝试通过 api 客户端(例如 Postman)与您的 API 对话。

    您可以在您引用的文章的第 11 步中看到作者实际上正在这样做。

    他正在执行以下步骤:

    • 调用令牌端点(无身份验证)
    • 将令牌添加到他的后续请求中

    为了调用具有授权的 API,您必须首先知道 auth 方法(basic、OAuth 等)。在这种情况下,您说的是 OAuth:

    看一下指南,它分享了这张图片:

    要在代码中执行此操作,您需要将以下标头添加到您的 http 客户端。假设您使用的是 vanilla System.Net.Http.HttpClient,您需要实现一个如下所示的类:

    public class APIClient
    {
        private HttpClient _client;
    
        public APIClient()
        {
            _client = SetupClient();
        }
    
        private HttpClient SetupClient()
        {
            //setup your client here
            var client = new HttpClient();
    
            //string oauthToken = TokenService.GetUserToken();
            string oauthToken = "eyJhbGciO......."; //Example token
            client.DefaultRequestHeaders.Add("Authorization", $"Bearer {oauthToken}");
    
            //more setup here
    
            return client;
        }
    
        public async Task<HttpResponseMessage> Get(string endpoint)
        {
            var request = new HttpRequestMessage(HttpMethod.Get, endpoint);
    
            return await CallAsync(request);
        }
    
        private async Task<HttpResponseMessage> CallAsync(HttpRequestMessage request)
        {
            //do things before?
    
            var result = await _client.SendAsync(request);
    
            //handle result? null? not success code?
    
            return result;
        }
    }
    

    当您初始化HttpClient 时,您应该添加以下标题:

    • Authorization : Bearer {yourtoken}

    现在后续的 api 请求将获得您的 api 客户端的授权。如何设置此不记名值取决于您。有些人将凭据存储在 xamarin 主 App 类中,然后检索该属性。其他人会将数据保存到 plist 中并让 apiclient 读取此值(可能凭据每 30 天过期)。

    尽管从 xamarin 应用程序与 api 对话会带来许多陷阱。您应该始终从您的应用程序外部调用您的 api 开始,从 api 客户端中调用您的 api。这将教您如何正确配置请求,而无需担心您的代码/配置是否正确。

    【讨论】:

      【解决方案2】:

      如果对你有帮助,请查看我的课程

         `public class ServicesClient
          {
      
              private HttpClient httpClient;
              private bool _IsConnection { get { return CheckInternet(); } }
              public bool IsConnection { get { return _IsConnection; } }
      
      
              public ServicesClient()
              {
                  httpClient = new HttpClient(new HttpClientHandler());
                  //You can change the key as you need and add value 
                  httpClient.DefaultRequestHeaders.Add("key", "000000");
              }
      
              //Get Method
              public async Task<T> GetAsync<T>(string URL) where T : class
              {
                  if (IsConnection)
                  {
                          var result = await httpClient.GetStringAsync(URL);
                          if (!string.IsNullOrEmpty(result))
                              return JsonConvert.DeserializeObject<T>(result);
                          else
                              return null;
                  }
                  return null;
              }
      
              //Post Method
              public async Task<T> PostAsync<T>(string URL, object param) where T : class
              {
                  if (IsConnection)
                  {
                      var json = JsonConvert.SerializeObject(param);
                      var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
      
                          var result = await httpClient.PostAsync(URL, httpContent);
                          if (result.IsSuccessStatusCode)
      
                                  return JsonConvert.DeserializeObject<T>(result.Content.ReadAsStringAsync().Result);
                  }
                  return null;
              }
      
              bool CheckInternet()
              {
                  return Connectivity.NetworkAccess == NetworkAccess.Internet;
              }
          }
      }`
      

      【讨论】:

      • OP 询问如何授权他们的 api 请求,这只是一个 API 客户端类,与 OP 的答案没有任何解释、授权或关系:/
      猜你喜欢
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2020-09-18
      • 2020-10-14
      • 2014-09-14
      相关资源
      最近更新 更多