Google-API-OAuth2 -, Service-Konto, "error" : "invalid_grant"
Ich versuche zur Nutzung von service-Konto synchronisieren von Kalendern aus Dynamics CRM-software von Google.
Während dieser stellte ich mich der Mangel der Dokumentation auf der google-API .net, vor allem hinsichtlich der Berechtigung. Die meisten Google-samples können nicht selbst kompiliert, weil auf veraltete Bibliotheken und Klassen verwendet.
So fand ich einige Beispiel über ein Praktikum und die Fehlermeldung. Könnte jemand bitte ein Blick auf mein Beispiel und sagen, was mache ich falsch?
Vorbereitende Schritte:
- Erstellte ich ein Projekt in meinem privaten Google-Konto.
- In project developer-Konsole unter APIS & AUTH -> Anmeldeinformationen, die ich generierte Service-Konto. Dann Klick auf "Generieren P12-key" heruntergeladen und die .p12-Datei.
- Unter APIS & AUTH -> APIs, wieder auf "Calendar API"
Dann erstellt Konsole app und schaffte es installieren OAuth und Kalender nuget-Pakete. Es gibt:
- Google APIs Auth-Client-Bibliothek Von Google.Apis.Auth 1.8.1
- Google APIs Client Library, Google.Apis 1.8.1
- Google-APIs Kern-Client-Bibliothek, Id: Google.Apis.Core-1.8.1
- Google.APIs.Kalender.v3-Client-Bibliothek von Google.Apis.Kalender.V3 1.8.1.860
Gibt es einen code gefunden und angepasst an meine Bedürfnisse:
using System;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Calendar.v3;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
namespace CrmToGoogleCalendar
{
class Program
{
static void Connect()
{
var certificate = new X509Certificate2("My Project-ee7facaa2bb1.p12", "notasecret", X509KeyStorageFlags.Exportable);
var serviceAccountEmail = "506310960175-q2k8hjl141bml57ikufinsh6n8qiu93b@developer.gserviceaccount.com";
var userAccountEmail = "<my email>@gmail.com";
var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
User = userAccountEmail,
Scopes = new[] { CalendarService.Scope.Calendar }
}
.FromCertificate(certificate));
var service = new CalendarService(new BaseClientService.Initializer()
{
ApplicationName = "Test calendar sync app",
HttpClientInitializer = credential
});
var calList = service.CalendarList.List().Execute().Items;
foreach (var cal in calList)
{
Console.WriteLine(cal.Id);
}
}
static void Main(string[] args)
{
Connect();
}
}
}
Die Kommunikation mit der Google API, die ich in der app und Fiddler ist:
Anfrage :
Host: HTTPS accounts.google.com URL: /o/oauth2/token
Behauptung: long binary-string
grant_type: urn:ietf:params:oauth:grant-Typ:jwt-bearer
Antwort:
HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control:
no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT Date: Thu, 24 Jul 2014 06:12:18
GMT X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block Server: GSE Alternate-Protocol:
443:quic Transfer-Encoding: chunked1f { "error" : "invalid_grant" } 0
Bitte um Hilfe und danke im Voraus!
Hi @luc. Ich fand, dass nach dem öffnen den Kalender in google apps web-Seite, es begann die Antwort mit
Error:"unauthorized_client", Description:"Unauthorized client or scope in request.", Uri:""
. Also den gleichen code noch ein Fehler. Ich denke immer noch, oder habe ich etwas verpasst in der Konfiguration von google richtigIch wurde immer diese Fehlermeldung auf dem Produktions-server. Nach der Suche durch Antworten wie diese, die ich endlich herausgefunden, es lag an der system-Uhr wird ausgeschaltet. stackoverflow.com/questions/11973162/...
InformationsquelleAutor Dimitry | 2014-07-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach einigen Untersuchungen habe ich festgestellt, dass Google-API funktioniert nicht wie erwartet mit Ihrem persönlichen Konto @gmail.com. Sie sollten über domain Organisation Konto im Google-format@your_organisation_domain
Dann, was auch ziemlich verwirrend, da ist die Dokumentation Google Drive-API-Seite, mit "Delegieren domain-große Behörde zu Ihrem service-Konto" Abschnitt nicht erwähnt, dass die Kalender-API-Seite.
Es gibt 7 Schritte in den Abschnitt, muss getan werden.
BTW mit persönlichen Konto-Verwaltungswebsite admin.google.com ist noch nicht verfügbar. So ist es unmöglich, führen Sie diese 7 Schritte mit @gmail.com Konto.
Dann, wenn der AUFTRAGGEBER ist berechtigt, in Google Apps-Admin-Konsole - > Security - > Erweiterte Einstellungen - > Verwaltung von OAuth-Client-Zugriff den code zu arbeiten beginnt.
Es ist ein code, der bei mir funktioniert:
Die erstellte Ausgabe sieht so aus:
Erste Veranstaltung ist wöchentlich wiederkehrende ganzen Tag-event-Reihe.
Zweite aktualisierte einzelnes Ereignis von der ersten (hat die gleiche UID).
Dritten ist die einzige Veranstaltung für eine Stunde.
Die Letzte erstellt durch obigen code.
Hoffe, das wird helfen, andere zu Wirtschaft Ihrer Zeit.
Ich bin mit dem gleichen Problem. Und nun verstehe ich Ihre Antwort ist, dass wenn ich verwenden möchten, Service-Konto für den Zugriff auf Google APIs (in meinem Fall die Kalender-APIs) ist es zwingend notwendig (aber nicht erklärt durch Google!!!) eine Google Admin Console-Konto, , ist eine Kostenlose 30-Tage-Testversion-service, der dann zu einem bezahlt-service... Right? Also ich kann nur die Verwendung von Web-Anwendung auf dem Konto...
Sie können zu Ihrem persönlichen gmail-Konto für den Zugriff auf Google-Kalender-API. Service account verwendet wird, für die domänenweite Authentifizierung.
This das war ja meine Frage. Ich habe es endlich geschafft die Arbeit mit Service-Konto. Siehe Abschnitt UPDATE am Ende meiner Frage.
hat der service-Konto-funktioniert mit jedem normalen gmail-Konto? Ich meine, wenn wir nicht alle Domäne-Konto? Ohne domain-account ist es nicht möglich, für die Anmeldung der domain-admin control panel. Aber Entwickler-Konsole ist verfügbar für alle Google Mail-Konto.
InformationsquelleAutor Dimitry
Ich bin mir nicht wirklich sicher, was ist falsch mit Ihrem code ich denke, die Artikel wie Sie sind, laden Sie die Schlüssel-Datei. Es könnte auch sein, die Tatsache, dass Sie nicht brauchen, um zu senden Benutzer mit ServiceAccountCredential da das service-Konto wird der Benutzer, den Sie Anmeldung. Ich bin nicht sicher, warum Sie das senden von someones Gmail-E-Mail.
Dieser code ist getestet, es zeigt Ihnen, wie Sie die ersten Kalender für das Dienstkonto. Ohne ein Kalender würde es wieder 0 Kalender, die Sie benötigen, zu erinnern, zu schaffen, einer der ersten.
Wenn ich das weglasse Benutzer in ServiceAccountCredential es Antworten mit 0 Kalender. Ich öffnete meine google-Kalender und sah einen Standard Kalender und Aufgaben. Immer noch code wieder entweder Fehler, wenn der Benutzer angegeben oder keine Daten, wenn nicht spezifiziert. Nachdem ich den Kalender geöffnet Fehlertext geändert
Error:"unauthorized_client", Description:"Unauthorized client or scope in request.", Uri:""
Ein service-Konto ist nicht Sie es, Ihre eigene Entität definiert durch den service-Konto-E-Mail-Adresse. Auch wenn Sie persönlich erstellt die service-Konto in der dev-Konsole bedeutet dies nicht, dass Sie Zugang zu Ihrem Google-Kalender, weil die nicht Sie. Sie können versuchen, und fügen Sie das service-Konto-E-Mail-Adresse, Ihr Kalender das könnte es geben, die Zugriff auf Ihren Kalender, aber ich habe es nicht ausprobiert.
Danke @DalmTo, ich fand die Antwort und du hast Recht - Falsches Konto verwendet wurde. Die API ist nicht vorgesehen, arbeiten mit " persönlichen Konto, obwohl es nicht erwähnt zu Kalender-API-Seite. Es ist ein guter doc auf der Drive Seite obwohl.
wenn Sie festgestellt eine Diskrepanz, die in der Dokumentation Blättern Sie nach unten, um den unteren Rand der Seite sollte es einen feedback-link. Senden Sie in einigen feed-back von Google geht durch die Dokumentation alle 3 Monate wenn ich mich richtig erinnere. Dieser sorgt dafür, dass Ihr fest für die nächste person.
InformationsquelleAutor DaImTo
ich hatte dasselbe problem, es war in Ordnung arbeiten auf dem remote-server, sondern auf dem lokalen server ich habe auch diesen Fehler, lange Geschichte kurz, nach Stunden der Kopfschmerzen fand ich heraus, problem war von meiner system-Uhr,gehen Sie einfach durch diesen Schritt
1. Klicken Sie auf die Uhr in Ihrem system
2. Klicken Sie auf Datum und Uhrzeit Ändern Einstellungen...
3. Klicken Sie auf die Registerkarte Internetzeit
4. Klicken Sie auf Einstellungen Ändern
dann schließlich aktualisieren Sie Ihre Uhr mit einem Zeit-Server
InformationsquelleAutor Abolfazl