【问题标题】:GET call to a Google API responds with "Unauthorized"对 Google API 的 GET 调用以“未经授权”响应
【发布时间】:2016-07-17 02:19:24
【问题描述】:

更新:想通了。我确实需要添加授权标头,如下面的回答,但我也相信我的特定用例的问题是访问令牌(我通过 Postman 验证)需要更多范围来完全验证我,这是有道理的,因为这个 API 包含调查我正在尝试访问的,它们也与 Google 帐户相关联。一旦我将访问调查所需的额外范围以及下面的授权标头代码添加到令牌请求中,我就能够成功连接。

更多关于向 C# 代码添加作用域的信息可以在这里找到:http://www.oauthforaspnet.com/providers/google/

希望这可以帮助遇到类似问题的任何人。谢谢大家!

我正在尝试对 Google API 进行 GET 调用,但在我登录到 Gmail 时,它一直以“未经授权”响应。我已经在 StartUp.Auth.cs 中实现了 Google+ 登录,甚至保存了访问令牌以供以后使用。

那么如何让 HttpClient 授权我呢?

我有一个可用的访问令牌,但我不知道如何正确传递它。我看过用户名和密码的例子,但如果我已经有访问令牌,我应该不需要传递这些参数?如果有的话,当我在运行解决方案之前注销时,如果需要,我应该能够将用户重定向到登录页面。

当项目运行时,我期望的是 GET 调用以 json 形式返回的结果,但它总是说我“未经授权”,而且我可能在某处遗漏了 1 行代码。 .

这是我正在使用的代码:

using (HttpClient client = new HttpClient())
{
    string _url = "https://www.googleapis.com/consumersurveys/v2/surveys?key={MY_API_KEY}";
    client.BaseAddress = new Uri(_url);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    using (HttpResponseMessage response = client.GetAsync(_url).Result)
    {
        if (response.IsSuccessStatusCode)
        {
            using (HttpContent content = response.Content)
            {
                var Content = content.ReadAsStringAsync();
                ViewBag.GoogleResponse = Content.ToString();
            }
        }
        else
        {
            // THIS IS ALWAYS UNAUTHORIZED!
            ViewBag.GoogleResponse = response.StatusCode + " - " + response.ReasonPhrase;
        }
    }
}

请提供想法或建议。谢谢!

【问题讨论】:

  • 试试:client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "xxx"); 其中 xxx 是你的令牌
  • 如果您按照developers.google.com/identity/protocols/OAuth2 获取令牌,那么我会说应该可以。令牌被授权的范围是否扩展到您尝试执行的操作? ViewBag.GoogleAccessToken 是否确定已填充?
  • 是的,我已经测试了在页面渲染上打印出来的令牌,它是在 GET 调用之前设置的。不过,您的答案与其他人相同,因此我将尝试更多地弄乱它并报告发生的情况。谢谢!
  • 没问题。我想你的意思是他们的回答和我一样;)
  • 我得到了 invalid_token 但这没有意义,因为令牌是刚刚创建的!我在这里提出了一个新问题:stackoverflow.com/questions/38403172/…

标签: c# asp.net-mvc httpclient


【解决方案1】:

您需要在Authorization Header 中传递身份验证令牌:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

【讨论】:

  • 没用,但你的答案和其他人一样,所以我会尝试再弄乱它一点,并报告发生了什么。谢谢!
  • 您可以尝试在 Fiddler、curl、Postman 等中发出请求,这样无论您的 HttpClient 代码如何,您都可以确保请求按预期工作?
  • 我已登录 Gmail,邮递员 GET 调用 someurl.com?key={MY_API_KEY} 返回: { "error": { "errors": [ { "domain": "global", "reason ": "required", "message": "需要登录", "locationType": "header", "location": "授权" } ], "code": 401, "message": "需要登录" } }
  • 我得到了 invalid_token 但这没有意义,因为令牌是刚刚创建的!我在这里提出了一个新问题:stackoverflow.com/questions/38403172/…
【解决方案2】:

您是否收到过对此 api/调查的回复?如果您无法通过使用 Postman 获取 API 的响应,则您可能在定位 API 的方式上存在问题。那里返回的错误似乎您没有在请求标头中包含令牌。您是否单击了请求 URL 下方的“授权”选项卡以将 OAuth 令牌添加到您的标头? (请记住,{} 字符需要进行 URL 编码)

另外,当您引用 MY_API_KEY 时,这是否与您的surveyId 相似?

我在这里没有太多经验,但我有几个建议:

1) 我同意 Pedro 的观点,您肯定需要在请求中包含授权标头。

2) 如果您的 MY_API_KEY 实际上是调查 ID,则您提供的 URL 可能不正确(GoogleAPIs 文档表明它应该是 http://www.googleapis.com/consumer-surveys/v2/surveys/surveyId >

建议(将您的 API 密钥移动到名为 MY_API_KEY 的字符串 var 之后):

string _url = "https://www.googleapis.com/consumersurveys/v2/surveys/";
client.BaseAddress = new Uri(_url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ViewBag.GoogleAccessToken);

using (HttpResponseMessage response = client.GetAsync(MY_API_KEY).Result)
{
    if (response.IsSuccessStatusCode)
    {
        using (HttpContent content = response.Content)
        {
            var Content = content.ReadAsStringAsync();
            ViewBag.GoogleResponse = Content.ToString();
        }
    }

参考:

 https://developers.google.com/consumer-surveys/v2/reference/
 http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

【讨论】:

  • 欣赏建议!当我执行 #2 时,它说“无法将 Task 隐式转换为 HttpResponseMessage。对于 #3,MY_API_KEY 是我在谷歌开发者控制台上的 oauth 2.0 客户端 ID 的 api 密钥。这是错误的信息吗?
  • 在 Postman 上我输入了 https://www.googleapis.com/consumersurveys/v2/… 并看到“未经授权”。 (我是 Postman 的新手,需要找到一个好的指南)。但无论如何,在我指定我想要查找的调查 ID 之前(我真的想得到我首先创建的那些的列表)我真正需要弄清楚的是为什么我无法通过这个“未授权”部分优先,除非它们完全连接?
  • 您不需要将客户端 ID 作为参数放入 URL 字符串中。正确授权后,您应该能够使用 OAuth 令牌对 googleapis.com/consumerserveys/v2/surveys url 执行 GET 请求,并且它应该返回与授权客户端关联的调查。 (我删除了第 2 部分 re: using 指令,因为它没有帮助)
  • 当您访问 Postman 时,您需要确保您的 OAuth 令牌在标头数据中。让 Postman 为您生成: 1) 打开 Postman 并添加目标 URL:googleapis.com/consumersurveys/v2/surveys 2) 单击“授权”选项卡,从下拉列表中选择 OAuth 2.0,并填写必要的详细信息 - 单击请求令牌 3) 之后授权信息已添加到标头中,请确保您已选择 GET 并尝试再次发送。
  • 感谢您提出的建议,我在能够验证 API 是否对 Postman 中的调查列表做出响应方面取得了一些进展,但是我无法让访问令牌在 OAuth2 生成的令牌之外工作.0 游乐场。我在 Postman 中生成的那些不起作用:stackoverflow.com/questions/38407333/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多