GET对Google API的调用以" Unauthorized"

时间:2016-07-14 22:06:23

标签: c# asp.net-mvc httpclient

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

有关向C#代码添加范围的更多信息,请访问:http://www.oauthforaspnet.com/providers/google/

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

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

那么如何让HttpClient授权给我?

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

项目运行时我所期待的是GET调用以json的形式返回的结果,但它总是说我是" m"未授权"我可能在某处错过了一行代码......

以下是我正在使用的代码:

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;
        }
    }
}

请帮助提出想法或建议。谢谢!

2 个答案:

答案 0 :(得分:0)

您需要在Public Class Service1 Dim cred As New NetworkCredential("Administrator", "*P4ssW0rD") Private Sub SchedularCallback(e As Object) 'Metodo Procesa Archivos tipo boleano Dim di As DirectoryInfo = New DirectoryInfo("\\132.147.161.83\SisInt\courts\agreement\J92016SEM2") For Each fi In di.GetFiles() 'seleccionamos los archivos con las extensiones de Word If fi.Extension.ToUpper = ".DOC" Or fi.Extension.ToUpper = ".DOCX" Then ListaArchivos.Add(fi.FullName) ListaNombres.Add((fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length))) End If Next 标题:

中传递身份验证令牌
Authorization

答案 1 :(得分:0)

你有没有得到这个api /调查的答复?如果您无法通过与Postman联系而获得API的响应,则可能会遇到针对API的问题。在那里返回的错误似乎并不是在请求标头中包含令牌。您是否单击了请求网址下方的“授权”标签,以将OAuth令牌添加到标头中? (请记住,{}字符需要进行URL编码)

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

我在这里没有很多经验,但我有几点建议:

1)我同意Pedro,你肯定需要在你的请求中加入授权标题。

2)如果您的MY_API_KEY实际上是调查ID,您可能会提供错误的网址(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