【问题标题】:Asana: 401: Not authorized on put requests but not on get requestsAsana:401:未授权 put 请求但未授权 get 请求
【发布时间】:2015-12-12 14:06:31
【问题描述】:

我正在开发一个 UWP 应用,以便快速了解我的体式任务并进行时间管理。但是,在一切正常的情况下,我无法更新任何任务。

设置如下:在导航到 OAuth 重定向 url 的情况下,我通过拦截导航事件通过 WebView-Element(托管 Web 浏览器)获取 oauth 令牌。

我按如下方式对其余服务执行我的 api 调用:

    private static async Task<JObject> CallApiGet(string api)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", TokenType + " " + AccessToken);
        HttpResponseMessage result = await client.GetAsync(baseAPIUrl + api);
        result.EnsureSuccessStatusCode();

        string asText = await result.Content.ReadAsStringAsync();
        return JObject.Parse(asText);
    }

    private static async Task<JObject> CallApiPut(string api, params string[] properties)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", TokenType + " " + AccessToken);



        var keys = properties.Where((item, index) => index % 2 == 0);
        var values = properties.Where((item, index) => index % 2 != 0);

        string urlEncoded = string.Join("&", keys.Zip(values, (key, value) => Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(value)));
        HttpContent content = new StringContent(urlEncoded, null, "application/x-www-form-urlencoded");

        HttpResponseMessage result = await client.PutAsync(baseAPIUrl + api, content);
        result.EnsureSuccessStatusCode();

        string asText = await result.Content.ReadAsStringAsync();
        return JObject.Parse(asText);
    }

现在奇怪的是,Get 调用有效,而 PUT 调用失败。一个例子是

CallApiPut("/tasks/<task id>", "notes","updated notes value");

知道为什么我的 put 调用返回 401:在我的 get 调用正常工作时未授权?请注意,我可以在 asana 的 web gui 中编辑指定的任务。

非常感谢您的帮助。

【问题讨论】:

  • 一般来说,没有理由你应该能够 GET 一个资源,但在 PUT 时得到一个 Unauthorized,除非你试图更新你不能更新的东西(比如设置一个你可以看到但不能修改的团队),即使那样你也应该得到一个 403 Forbidden。您可以尝试使用curl -v 复制案例吗?那时还会发生吗?我对 UWP 不是很熟悉,所以将其放到“查看线路上的位”可能会有所帮助。
  • 我试过了,我得到了完全相同的结果......你在 curl 的详细输出中寻找什么具体的东西?我的请求: curl --request PUT -H "Authorization: bearer " app.asana.com/api/1.0/tasks/<task id> -d "notes=" -v
  • 嗯,其实“Authorization: Bearer”会返回Not Authorized,因为“bearer”需要大写。如果您将其修复为“Authorization: Bearer [TOKEN]”,curl 调用是否仍然失败?
  • 旧线程,但我的问题是“承载”后缺少空格。当令牌过去以“0”开头时它起作用,但它不适用于以“1”开头的令牌。 ¯_(ツ)_/¯ 无论如何,我希望对某人有所帮助

标签: c# uwp asana asana-api


【解决方案1】:

我使用了Authorization: bearer 而不是Authorization: Bearer。注意大写,这样就行了!奇怪的是,小写的 bearer 在 oauth 期间返回(响应中的 token_type)并且适用于 GETting 但不适用于 PUTing。

无论如何,谢谢 Agnoster。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2012-08-17
    • 2016-10-24
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多