2012-06-20 15 views
11

Ich versuche, Google oAuth 2 für hier beschriebene Dienstkonten zu implementieren: https://developers.google.com/accounts/docs/OAuth2ServiceAccount auf UnityScript (oder C# - das macht nichts, da beide das gleiche .NET verwenden Klassen).Google oAuth 2.0 (JWT-Token-Anforderung) für Dienstanwendung

Ich habe ähnliches Thema hier gefunden: Is there a JSON Web Token (JWT) example in C#? Web-Token-JWT-Beispiel-in-c, aber ich habe immer noch keinen Erfolg.

Fist of all, ich habe erzeugte Header und ClaimSet (die genau wie in Google Dokumentation sind)

var header: String = GetJWTHeader(); 
var claimset: String = GetJWTClaimSet(); 

Das Ergebnis wird (mit neuen Linien zur Klarheit getrennt):

{ "alg": "RS256", "typ": "JWT"}

{ "iss": "425466719070-1dg2rebp0a8fn9l02k9ntr6u5o4a8lp2.apps.googleusercontent.com",

"Umfang": "https://www.googleapis.com/auth/prediction",

"Aud": "https://accounts.google.com/o/oauth2/token",

"exp": 1340222315,

"iat": 1340218715}

Basis -64 Kodierungsmethoden:

public static function Base64Encode(b: byte[]): String { 
    var s: String = Convert.ToBase64String(b); 
    s = s.Replace("+", "-"); 
    s = s.Replace("/", "_"); 
    s = s.Split("="[0])[0]; // Remove any trailing '='s 
    return s; 
} 

public static function Base64Encode(s: String): String {  
    return Base64Encode(Encoding.UTF8.GetBytes(s)); 
} 

Dann mache ich ein Signat ure.

var to_sign: byte[] = 
    Encoding.UTF8.GetBytes(Base64Encode(header) + "." + Base64Encode(claimset)); 
var cert: X509Certificate2 = 
    new X509Certificate2(google_pvt_key.ToArray(), "notasecret"); 
var rsa: RSACryptoServiceProvider = cert.PrivateKey; 
var sgn: String = Base64Encode(rsa.SignData(to_sign, "SHA256")); 

var jwt: String = Base64Encode(header) + "." + Base64Encode(claimset) + 
        "." + sgn; 

Und dann bilden die Anfrage:

var url: String = "https://accounts.google.com/o/oauth2/token"; 
var form: WWWForm = new WWWForm(); 
form.AddField("grant_type", "assertion"); 
form.AddField("assertion_type", "http://oauth.net/grant_type/jwt/1.0/bearer"); 
form.AddField("assertion", jwt); 
var headers: Hashtable = form.headers; 
headers["Content-Type"] = "application/x-www-form-urlencoded"; 

var www: WWW = new WWW(url, form.data, headers); 

Und alles, was ich bekommen ist "Fehler 400: Bad Anfrage".

Die codierten Daten sieht wie (Zeilenumbrüche aus Gründen der Klarheit hinzugefügt):

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnMnJlYnAwYThmbjlsMDJrOW50cjZ1NW80YThscDIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTM0MDIyMjMxNSwiaWF0IjoxMzQwMjE4NzE1fQ.

lIFg7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4reTVVAtuW06DeGsdcBMNgEdIMvN6VuYQybs64p9mqrfECBYxO1FWHbUG-2On1IpowybEsRRUjZfp0jFuEY7SLE3XRaXan0k5zmejcvLQo

Ich habe zwei Tage lang versucht, herauszufinden, was falsch ist, aber ich kann nicht sehen.

Auch konnte ich keine geeignete Dokumentation und Beispiele finden.

Ich versuche nur ein Token zu erhalten.

  1. Unterzeichne ich die Bytes richtig?
  2. Wie sollte der "Scope" -Parameter im Claimset aussehen? Ich habe versucht "https://www.googleapis.com/auth/devstorage.readonly" und "https://www.googleapis.com/auth/prediction".
  3. Welcher "iss" Parameter sollte gleich sein? Client-ID oder E-Mail-Adresse? (versuchte beide)
  4. Was sind die Möglichkeiten, um meinen Fehler zu finden?
  5. Gibt es C# -Bibliotheken für die Dienstanwendung (nicht für installierte Anwendungen oder Client-Anmeldung)?

Ich bin immer verrückt ... Es hat zu arbeiten, aber es funktioniert ... nicht: -/

+0

Ich habe eine harte Zeit zu implementieren Service Account-Authentifizierung in C#! Können Sie mir bestätigen, dass Sie die Felder grant_type und assertion_type erfolgreich verwendet haben, wie sie in Ihrem Beispiel gezeigt werden? danke – Nick

Antwort

7

Die Lösung war, dass alle Schrägstriche in Anforderungscode

werden backslashed haben

FALSCH:

"scope":"https://www.googleapis.com/auth/prediction", 
"aud":"https://accounts.google.com/o/oauth2/token", 

RICHTIG:

"scope":"https:\\/\\/www.googleapis.com\\/auth\\/prediction", 
"aud":"https:\\/\\/accounts.google.com\\/o\\/oauth2\\/token", 
+0

seoulburner du bist mein Held! Vielen Dank! Ich wünschte, ich könnte 10 Mal aufladen: D –

1

Ich habe beantwortet eine ähnliche Frage mit einem Vorschlag von einem sehr einfachen, aber funktionierende Implementierung mit der .NET Google OAuth API here

Verwandte Themen