【问题标题】:Error 500 with authorization while consuming OAuth2 RESTful service through C#通过 C# 使用 OAuth2 RESTful 服务时出现授权错误 500
【发布时间】:2015-06-24 17:32:20
【问题描述】:

我目前的工作是使用带有 OAuth2 的 RESTful API。目前,我研究了如何获取访问令牌,并且在我使用 chrome 扩展程序 Rest Console 时它工作正常,但是当我尝试从我的应用程序中执行此操作时,我总是收到错误,即我正在发送无效的 OAuth 请求。下面你可以看到我尝试使用 API 的三种方式,但都没有成功。该页面总是返回错误 500。如果我错过了一些重要的信息,我们将不胜感激。

    var auth = "Bearer " + item.access_token;


    /* First Attempt */
    var client = new RestClient("http://<link>");
    var request = new RestRequest("sample", Method.GET);
    request.AddHeader("Authorization", auth);
    request.AddHeader("Content-Type", "application/json;charset=UTF-8");
    request.AddHeader("Pragma", "no-cache");
    request.AddHeader("User-Agent", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36");
    request.AddHeader("Accept", "application/json");
    request.RequestFormat = DataFormat.Json;
    var response = client.Execute(request);
    var content = response.Content;





    /* Second Attempt */
    string sURL = "http://<link>/sample";

    string result = "";

    using (WebClient client = new WebClient())
    {
        client.Headers["Authorization"] = auth;
        client.Headers["Content-Type"] = "application/json;charset=UTF-8";
        client.Headers["Pragma"] = "no-cache";
        client.Headers["User-Agent"] = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36";
        client.Headers["Accept"] = "application/json";

        byte[] byteArray = Encoding.UTF8.GetBytes(parameters);

        var result1 = client.DownloadString(sURL);
    }


    /* Third Attempt */
    var request = (HttpWebRequest)WebRequest.Create(sURL);
    request.Method = "GET";
    request.ContentType = "application/json;charset=UTF-8";
    request.Accept = "application/json";
    request.Headers["Authorization"] = auth;
    request.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36";
    string content;
    HttpStatusCode statusCode;
    using (var response = request.GetResponse())
    using (var stream = response.GetResponseStream())
    {
        var contentType = response.ContentType;
        Encoding encoding = null;
        if (contentType != null)
        {
            var match = Regex.Match(contentType, @"(?<=charset\=).*");
            if (match.Success)
                encoding = Encoding.GetEncoding(match.ToString());
        }

        encoding = encoding ?? Encoding.UTF8;

        statusCode = ((HttpWebResponse)response).StatusCode;
        using (var reader = new StreamReader(stream, encoding))
            content = reader.ReadToEnd();
    }

--------编辑--------

对于第一次尝试,我还尝试将身份验证添加到客户端变量 client.Authenticator = Authenticate; 其中OAuth2AuthorizationRequestHeaderAuthenticator Authenticate = new OAuth2AuthorizationRequestHeaderAuthenticator(item.access_token, item.token_type);

【问题讨论】:

  • 您真的应该使用var auth = "Bearer " + item.access_token; 而不是您客户的标识符和密码来检索令牌吗?如果您只能设法获得授权码,那么 access_token 是从哪里来的?您也可以尝试省略“Pragma”、“User-Agent”和“Accept”标头,它们在这里可能不是必需的。
  • 您是否尝试过在解决方案资源管理器中右键单击“参考”并使用“添加服务参考”?这可能对您有很大帮助并减少您的编码时间。
  • item.accesss_token 使用我的代码中编写的第二次尝试更早地解决了同一 API 的另一部分。它已正确解析,如果我使用从这里获得的令牌和 Rest Console,则 api 按预期工作。我试过没有额外的标题,但没有任何区别。我在某处读到我可以通过 url 传递 access_token,所以我试了一下 - 没用。
  • 您想访问哪个 API?使用令牌来获取令牌是不常见的。您可以将授权代码或刷新令牌换成新的访问令牌。您能描述一下您正在使用的工作流程吗?
  • 很抱歉造成误解。使用 WebClient 的第二种方式,我成功地将请求发送到 API,您在上面看到的实际上是我尝试使用相同的方式从 API 获取数据。 API 不是流行的 API 之一

标签: c# rest oauth oauth-2.0 restful-authentication


【解决方案1】:

代码似乎正确。您所做的失败尝试表明问题出在令牌而不是代码上。不记名令牌有过期时间。因此,就像您的令牌在您第一次使用 chrome REST 控制台扩展程序和您编写代码之间过期一样。但这里奇怪的情况是你得到的 500 错误代码。 401 是令牌过期或不存在时的标准响应。 500 错误代码总是意味着服务器错误。

【讨论】:

  • 感谢您的快速响应,但令牌不是问题。这两个操作是一个接一个地进行的。我刚刚获得令牌并尝试从 API 请求数据,如果我在 RestConsole(Chrome 扩展程序)中使用与此请求相同的令牌,它会正确提取数据。此外,我使用 Wireshark 捕获了 2 个请求,但我看不出有任何差异,所以我认为我的代码可能有问题。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2015-01-21
相关资源
最近更新 更多