【问题标题】:How to call a web api that has Oauth 2.0如何调用具有 Oauth 2.0 的 Web api
【发布时间】:2022-08-14 12:14:02
【问题描述】:

嗨,所以我们有一个外部 web api,我们想调用它来获取数据。它使用的是 oauth 2.0。有人可以解释一下我们将如何在 .NET 或 vb.net 或 c# 中执行此操作。我过去创建过 api,但是这个似乎很复杂。首先,您必须登录他们拥有的 oauth 网页,该网页会生成一些 cookie,通过在邮递员中同步它们来使用这些 cookie,我们可以看到数据,但是我们需要将其放在我们的 .net 应用程序中。有人可以帮助我们如何解决这个问题。一些代码会很有用。

谢谢

  • 您应该首先阅读 OAuth 规范 (oauth.net/2)。实现这一点的方法大致如下: 1. 获取第 3 方 oauth URL 2. 在您的 http 服务器上创建一个将接收 auth 令牌的端点 3. 将返回 url(指向您的端点)添加到 oauth URL 4. 向 URL 启动一个 Web 视图(嵌入式浏览器视图)并等待您的 enpoint 被触发
  • 嗨,好的,所以我意识到其中一些是需要的,但这并没有告诉我如何。就像我们有 oauth url,那么我们如何使用 c# 或任何其他语言进行连接。那么我们如何使用接收到的token来调用我们拥有的api url。
  • 您不要“调用” OAuth,使其工作的唯一方法是打开浏览器或 web 视图并将其指向该 URL(您已对其进行了修改以包含您的返回地址)。然后应用程序等待,直到第三方使用身份验证令牌调用后端。您保存该令牌并通知应用程序。然后您使用该令牌向您的后端发出请求。
  • 首先,您尝试使用传递 url 和凭据的 PostMan 代理,或尝试使用 Chilkat dll 获取令牌。如果你分享一些细节是使用完整的找出。如果您尝试使用 Postman Agent,那么您可以从 Postman Agent 页面本身获取 C# 代码,

标签: c# vb.net oauth-2.0 webapi


【解决方案1】:

不知道你在问什么。我有一个控制器代码,我在其中使用 web api 调用来验证用户。您可以使用自己的模型来传递数据。如果您的 web api 需要令牌来请求,那么您可能必须先获取令牌才能调用任何方法。希望这可以帮助。

 OktaUserDetailsModel Model = new OktaUserDetailsModel();
                Model.username = model.UserName;
                Model.password = model.Password;
                using (var httpClient = new HttpClient())
                {
                   
                    HttpContent inputContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(Model), System.Text.Encoding.UTF8, "application/json");
                    HttpResponseMessage response = httpClient.PostAsync(ConfigurationManager.AppSettings["OktaAPIuri"], inputContent).Result;
                   
                    if (response.IsSuccessStatusCode)
                    {
                        
                        string strResponse = (new JavaScriptSerializer()).Deserialize<string>(response.Content.ReadAsStringAsync().Result);
                        if (strResponse.ToUpper() == "TRUE")
                            return OktaSingleSignOnLogin(astrReturnUrl, model.UserName);
                        else
                            return ErrorPage();
                    }
                    else
                    {
                       
                        return ErrorPage();
                    }
                }

【讨论】:

    【解决方案2】:

    这就是 OAuth 2 身份验证通常的工作方式。

    您基本上使用用户名和密码(可选的第二个因素)登录,然后您会收到一个令牌,即所谓的Json Web Token 或 JWT(它包含有关您的用户、您的访问角色或您所属的组以及一些时间戳,它是令牌的到期时间)。

    在您向服务器发出的每个后续请求中,您都会在请求标头中传递此令牌(或者在您的情况下作为 cookie)。

    示例代码:

    登录请求:

    HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Post, new Uri(_baseUrl, "token"));
    string body = JsonConvert.SerializeObject(new
    {
        Username = _userName,
        Password = _password,
        secondFactor = secondFactor
    });
    httpRequest.Content = new StringContent(body, Encoding.UTF8, "application/json");
    var response = await client.SendAsync(httpRequest);
    var responseContent = await response.Content.ReadAsStringAsync();
    if (response.IsSuccessStatusCode)
    {
        TokenResult r = JsonConvert.DeserializeObject<TokenResult>(responseContent);
        if (!string.IsNullOrWhiteSpace(r.token))
        {
            _token = r.token;
            _tokenValidity = r.expirationDate;
            _refreshToken = r.refreshToken;
            _refreshTokenValidity = r.refreshTokenExpirationDate;
            return _token;
        }
        else
        {
            throw new Exception($"Failed to get token from server.\r\n{responseContent}");
        }
    }
    

    现在您在请求标头中的后续请求中使用_token

    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _token);
    using HttpResponseMessage response = await client.GetAsync(new Uri(_baseUrl, relativePath));
    if (response.IsSuccessStatusCode)
    {
        using var stream = await response.Content.ReadAsStreamAsync();
        stream.Position = 0;
        using var reader = new StreamReader(stream);
        reader.ReadToEnd();
    }
    

    请注意,通常令牌具有一定的生命周期,之后它基本上是无用的。一些 API 提供了一个刷新令牌,用户无需使用用户名和密码再次登录即可请求新令牌,但这超出了此问题的范围。

    你说你必须使用令牌作为cookie?好吧,有些 API 可以像这样工作,但就我个人而言,我从未见过这样的 API,这就是为什么我不能为您提供太多帮助,但它不应该比将您获得的令牌放入带有 cookie 的 cookie 更多一定的名字。

    希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2013-11-19
      • 2018-01-17
      • 2014-08-19
      相关资源
      最近更新 更多