2016-07-14 5 views
0

UPDATE: Das herausgefunden. Ich musste den Berechtigungsheader wie unten beantwortet hinzufügen, aber ich glaube auch, dass das Zugriffstoken (das ich über Postman verifizierte) mehr Bereiche benötigte, um mich vollständig zu authentifizieren, was sinnvoll ist, da diese API Umfragen enthält auf die ich zugreifen möchte, die auch mit einem Google-Konto verknüpft sind. Nachdem ich die zusätzlichen Bereiche, die für den Zugriff auf die Umfragen erforderlich waren, zu der Token-Anfrage zusammen mit dem Autorisierungs-Header-Code hinzugefügt hatte, konnte ich mich erfolgreich verbinden.GET Anruf an eine Google API antwortet mit "Nicht autorisiert"

Weitere Informationen über Bereiche zu C# Code hinzufügen kann hier gefunden werden: http://www.oauthforaspnet.com/providers/google/

hoffe, das hilft jemand in ähnliche Probleme läuft. Danke allen!

Ich versuche, einen GET-Aufruf an eine Google API zu senden, aber es reagiert weiterhin mit "Unauthorized", während ich bei Google Mail angemeldet bin. Ich habe die Google+ Anmeldung bereits in StartUp.Auth.cs implementiert und das Zugriffstoken sogar zur späteren Verwendung gespeichert.

Also wie bekomme ich den HttpClient, um mich zu autorisieren?

Ich habe ein Zugriffs-Token verfügbar, aber ich weiß nicht, wie es richtig übergeben wird. Ich habe Beispiele mit Benutzernamen und Passwörtern gesehen, aber ich sollte diese Parameter nicht weitergeben müssen, wenn ich bereits ein Zugriffs-Token habe? Wenn überhaupt, sollte ich in der Lage sein, den Benutzer auf eine Anmeldeseite umleiten zu lassen, wenn dies erforderlich ist, wenn ich mich abmelde, bevor ich die Lösung ausführe.

Was ich erwarte, wenn das Projekt ausgeführt wird, ist das Ergebnis des GET-Aufrufs, in Form von json zurück zu kommen, aber es sagt immer, ich bin "Unauthorized" und mir fehlt wahrscheinlich irgendwo eine Codezeile.

..

Hier ist der Code ich verwende:

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

Bitte mit Ideen oder Vorschläge helfen. Vielen Dank!

+0

Versuchen Sie: 'client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue (" Bearer "," xxx ");' wobei xxx Ihr Token ist –

+0

Wenn Sie ein Token gemäß https://developers.google.com/identity erhalten/protocols/OAuth2 dann hätte ich gesagt, das sollte funktionieren. Erweitert sich der Bereich, für den das Token autorisiert ist, auf die Operation, die Sie ausführen möchten? Ist ViewBag.GoogleAccessToken definitiv ausgefüllt? –

+0

Ja, ich habe das Token getestet, das auf der Seite Rendern ausgedruckt wird, und es wird gesetzt, bevor der GET-Aufruf erfolgt. Sie haben die gleiche Antwort wie jemand anders, also werde ich versuchen, ein bisschen mehr damit zu tun und berichten, was passiert. Vielen Dank! – ForeverLearningAndCoding

Antwort

0

Sie benötigen die Auth-Token in einem Authorization Header übergeben:

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

Hat nicht funktioniert, Aber Sie haben die gleiche Antwort wie jemand anders, also werde ich versuchen, etwas mehr damit zu tun und darüber zu berichten, was passiert. Vielen Dank! – ForeverLearningAndCoding

+1

können Sie versuchen, die Anfrage in Fiddler, Curl, Postman usw., so dass Sie sicherstellen können, dass die Anfrage funktionieren, wie Sie erwarten würden, unabhängig von Ihrem HttpClient-Code? – Pedro

+0

ich angemeldet bin in Google Mail und der Postbote zu https://www.someurl.com?key={MY_API_KEY GET rufen} gibt diese: { "Fehler": { "Fehler": [{ "domain": "global", "Grund": "erforderlich", "message": "Login erforderlich", "location": "header", "location": "Autorisierung" } ], "Code": 401, "Nachricht": "Anmeldung erforderlich" } } – ForeverLearningAndCoding

0

Haben Sie schon einmal eine Antwort für diese api/Umfrage bekommen? Wenn Sie keine Antwort von der API erhalten konnten, indem Sie sie mit Postman anklickten, traten möglicherweise Probleme bei der Ausrichtung der API auf. Der dort zurückgegebene Fehler scheint so zu sein, als ob Sie das Token nicht in Ihren Anforderungsheader aufgenommen hätten. Haben Sie auf die Registerkarte Autorisierung unter der Anforderungs-URL geklickt, um das OAuth-Token zu Ihrer Kopfzeile hinzuzufügen? (Denken Sie daran, dass die Zeichen {} URL-codiert sein müssen)

Wenn Sie MY_API_KEY referenzieren, ist das auch für Ihre Umfrage-ID analog?

ich hier nicht viel Erfahrung haben, aber ich habe ein paar Vorschläge:

1) I mit Pedro einverstanden sind, müssen Sie auf jeden Fall den Authorization-Header in Ihre Anfrage aufzunehmen.

2) Wenn Ihr MY_API_KEY in der Tat ist die Umfrage-ID, können Sie eine falsche URL (GoogleAPIs Dokumentation zeigt an, vorausgesetzt, dass es < http://www.googleapis.com/consumer-surveys/v2/surveys/surveyId>

Empfehlung (nach dem Verschieben Ihrer API-Schlüssel sein sollte in einen String var genannt 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(); 
     } 
    } 

Referenz:

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

Schätzen Sie die Vorschläge! Als ich # 2 tat, konnte ich "Task nicht implizit in HttpResponseMessage konvertieren. Für # 3 ist MY_API_KEY der API-Schlüssel für meine OAuth 2.0-Client-ID in der Google Developer Console. Ist das die falsche Information? – ForeverLearningAndCoding

+0

Auf Postman habe ich getippt in http: // https: //www.googleapis.com/consumersurveys/v2/surveys? key = MY_API_KEY und siehe "Unauthorized" (Ich bin neu bei Postman und brauche einen guten Guide). Aber wie auch immer, vorher Ich gebe an, welche Umfrage-ID ich nachschlagen möchte (ich habe wirklich versucht, eine Liste von denen zu bekommen, die ich zuerst erstellt habe), was ich wirklich herausfinden muss, ist, warum ich diesen "nicht autorisierten" Teil nicht durchhalte erstens, wenn sie nicht vollständig verbunden sind? – ForeverLearningAndCoding

+0

Sie sollten die Client-ID nicht als Parameter in die URL-Zeichenfolge eingeben.Wenn Sie ordnungsgemäß autorisiert haben, sollten Sie in der Lage sein, eine GET-Anforderung mit dem OAuth-Token für https: // auszuführen. www.googleapis.com/consumerserveys/v2/surveys URL, und es sollte die mit der Autorisierung verbundenen Umfragen zurückgeben Ed Client. (Ich entfernte Teil 2 um: mit Direktive, da es nicht hilfreich war) – Andrew

Verwandte Themen