2016-07-14 29 views
0

更新來進行響應。我需要添加授權頭,如下面的答案,但我也相信我的特殊用例的問題是訪問令牌(我通過Postman驗證)需要更多的範圍來完全驗證我,這是有道理的,因爲此API包含調查我嘗試訪問的內容也與Google帳戶相關聯。一旦我將額外的訪問調查問卷所需的額外範圍與授權標題代碼一起添加到令牌請求中,我就能夠成功連接。get調用的API,谷歌用「未授權」

上添加範圍爲C#代碼更多信息可以在這裏找到:http://www.oauthforaspnet.com/providers/google/

希望這有助於任何人都遇到類似的問題。謝謝大家!

我試圖做一個GET調用谷歌的API,但它一直以「未授權」響應,而我到Gmail登錄我。我已經在StartUp.Auth.cs中實現了Google+登錄功能,甚至保存了訪問令牌供以後使用。

那麼,如何讓HttpClient的授權嗎?

我有一個訪問令牌可用的,但我不知道如何正確地傳遞進去。我見過用戶名和密碼的例子,但是如果我已經有訪問令牌,我不需要傳遞這些參數。如果有的話,我應該能夠讓用戶重定向到登錄頁面,而不是在運行解決方案之前註銷時才需要。

我期待什麼時候運行項目,GET調用的結果是以json的形式返回,但它總是說我是「未經授權」,我可能在某處丟失了一行代碼。 ..

這裏是我使用的代碼:

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

請想法或建議幫助。謝謝!

+0

嘗試:'client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(「Bearer」,「xxx」);'其中xxx是您的令牌 –

+0

如果您根據https://developers.google.com/identity獲取令牌/ protocols/OAuth2然後我會說這應該工作。令牌被授權的範圍是否擴展到您正在嘗試執行的操作? ViewBag.GoogleAccessToken是否被填充? –

+0

是的,我已經測試了在頁面渲染上打印輸出的令牌,並且它在進行GET調用之前設置。你和別人有同樣的答案,所以我會嘗試更多的東西並報告發生的事情。謝謝! – ForeverLearningAndCoding

回答

0

您需要通過身份驗證令牌在Authorization標題:

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

沒有工作,但是你有與其他人相同的答案,所以我會嘗試更多一些,並報告發生的情況。謝謝! – ForeverLearningAndCoding

+1

您可以嘗試在Fiddler,Curl,Postman等中發出請求,以便您可以確保請求正常工作,無論您的HttpClient代碼如何? – Pedro

+0

我登錄到Gmail和Postman GET調用https://www.someurl.com?key={MY_API_KEY}返回:{ 「error」:{ 「errors」:[ { 「domain」: 「全局」, 「原因」: 「需要」, 「消息」: 「需要登錄」, 「的locationType」: 「首標」, 「位置」: 「授權」 } ], 「代碼」: 401, 「message」:「需要登錄」 } } – ForeverLearningAndCoding

0

你有沒有得到這個API /調查的迴應?如果您無法通過使用Postman進行API響應,您可能會遇到針對API的問題。返回的錯誤好像你沒有在你的請求頭中包含令牌。您是否點擊了請求網址下方的授權標籤,將OAuth令牌添加到您的標頭中? (請記住,在{}字符需要URL編碼)

此外,當您正在引用MY_API_KEY,是analagous您surveyId?

我沒有很多的經驗在這裏,但我有幾個建議:

1)我同意佩德羅,你一定要包括授權頭在你的請求。

2)如果您MY_API_KEY其實是在調查ID,你可能會提供不正確的URL(GoogleAPIs文件表明,它應該是< http://www.googleapis.com/consumer-surveys/v2/surveys/surveyId>

建議(移動你的API密鑰後,爲字符串VAR名爲MY_API_KEY):

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 
+0

欣賞建議!當我做了#2它說:「不能隱式地轉換任務到HttpResponseMessage。對於#3,MY_API_KEY是我的oauth 2.0客戶端ID在谷歌開發者控制檯上的api鍵是否是錯誤的信息? – ForeverLearningAndCoding

+0

在郵遞員我輸入在http:// https://www.googleapis.com/consumersurveys/v2/surveys?key = MY_API_KEY,並參閱「未經授權」(我是Postman的新手,需要找一本好的指南),但無論如何,我開始指定我想要查看的調查ID(我真的試圖獲得我創建的調查ID列表),我真正需要弄清楚的是爲什麼我無法通過這個「未授權」部分首先,除非它們完全連接? – ForeverLearningAndCoding

+0

您不需要將客戶端ID作爲參數放入URL字符串中。一旦授權正確,您應該能夠使用OAuth令牌對https://執行GET請求www.googleapis.com/consumerserveys/v2/surveys網址,它應該返回與授權人相關的調查編輯客戶端。 (我刪除了第2部分re:使用指令,因爲它沒有幫助) – Andrew