【问题标题】:oAuth uStream APIoAuth uStream API
【发布时间】:2017-04-21 18:26:25
【问题描述】:

我正在尝试使用他们的 API 和 oAuth 从 uStream 获取数据。我可以获得身份验证令牌,并且该令牌在 Rest API 客户端中确实有效,并且我可以获得数据。但是我无法在我的项目中获取数据......我不断收到 401 unauth..

代码:

 protected void Page_Load(object sender, EventArgs e)
    {
        var client = new RestClient("https://www.ustream.tv/oauth2/token");
        var request = new RestRequest(Method.POST);
        request.AddHeader("authorization", "Basic xxxxxxxxxxxxxxxxxx");
        request.AddHeader("content-type", "application/x-www-form-urlencoded");
        request.AddParameter("application/x-www-form-urlencoded", "client_secret=xxxxxxxxxxxxx&client_id=xxxxxxxxxxxx&grant_type=client_credentials&=", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);

        IRestResponse<TokenObject> response2 = (IRestResponse<TokenObject>)client.Execute<TokenObject>(request);

        var tknName = response2.Data.access_token;

        GetData(tknName);
    }

        public void GetData(string token)
    {
        var client = new RestClient("https://api.ustream.tv/channels/206844441.json");
        var request = new RestRequest(Method.GET);
        request.AddHeader("authorization", "Bearer" + token);
        request.AddHeader("content-type", "application/x-www-form-urlencoded");

        IRestResponse jsonResponse = client.Execute(request);

        IRestResponse<Channel> json2Response2 = (IRestResponse<Channel>)client.Execute<Channel>(request);

        var blah = json2Response2.Content;
    }

jsonResponse 返回 401...但我可以在 API 客户端(如 Insomnia)中使用令牌,它会工作...我可以获取数据。

关于我做错了什么有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# api oauth-2.0 restsharp


    【解决方案1】:

    实际上我做错了两件事。 @João Angelo 指出的第一个是字符串之间缺少的空格:Bearer & token。

    第二个也是最令人沮丧的是,授权需要是 Authorization... 大写 A。现在它可以工作了...。感谢您的帮助。

    【讨论】:

      【解决方案2】:

      正如 João 所提到的,主要问题是字符串“Bearer”和令牌本身之间缺少空格字符。在你解决这个问题后,我很确定它会起作用。 是的,Content-Type 对于 GET 请求来说是多余的,但它不会损害您请求的成功。

      此外,您无需提供两次客户端密码。这足以通过 Authorization 标头或请求正文中的 client_secret 属性提供它。

      所以,以这种方式提供秘密就足够了:

      request.AddHeader("authorization", "Basic xxxxxxxxxxxxxxxxxx");
      

      在这种情况下,您不应该在请求正文中再次提供秘密,这是基于原始代码的修改后的调用:

      request.AddParameter("application/x-www-form-urlencoded", "client_id=xxxxxxxxxxxx&grant_type=client_credentials&=", ParameterType.RequestBody);
      

      【讨论】:

      • 你能添加一些代码让你的答案更清楚吗?
      【解决方案3】:

      假设token没有以单个空格为前缀,那么这一行:

      request.AddHeader("authorization", "Bearer" + token);
      

      应该改为(在 Bearer 后面加一个空格):

      request.AddHeader("authorization", "Bearer " + token);
      

      另外,GET 数据请求不需要在请求中添加Content-Type 标头;虽然包含不太可能导致错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2016-07-31
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多