Google oAuth 2.0 (demande de jeton JWT) pour l'application de service

Je suis en train de mettre en œuvre Google oAuth 2 pour les comptes de service décrite ici: https://developers.google.com/accounts/docs/OAuth2ServiceAccount sur UnityScript (ou en C# qui n'a pas d'importance, car ils utilisent tous les deux le même Mono .NET classes).

J'ai trouvé de sujet similaire ici: Est-il un JSON Web Jeton (JWT) exemple en C#?
web-jeton-jwt-exemple en c, mais je n'ai toujours pas un succès.

Poing, j'ai généré en-tête et claimset (qui sont, tout comme dans google documents)

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

Le résultat est (séparés avec de nouvelles lignes pour plus de clarté):

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

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

"champ d'application":"https://www.googleapis.com/auth/prediction",

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

"exp":1340222315,

"iat":1340218715}

Encodage Base 64 méthodes:

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

Puis je fais une signature.

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;

Et formant alors la demande:

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

Et tout ce que j'obtiens est "Erreur 400: Bad request".

Les données codées ressemble (les sauts de ligne ajouté pour plus de clarté):

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXvcj9.

eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnmnjlynawythmbjlsmdjrow50cjz1nw80ythscdiuyxbwcy5nb29nbgv1c2vyy29udgvudc5jb20ilcjzy29wzsi6imh0dhbzoi8vd3d3lmdvb2dszwfwaxmuy29tl2f1dggvchjlzgljdglvbiisimf1zci6imh0dhbzoi8vywnjb3vudhmuz29vz2xllmnvbs9vl29hdxromi90b2tlbiisimv4cci6mtm0mdiymjmxnswiawf0ijoxmzqwmje4nze1fq.

lIFg7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4retvvatuw06degsdcbmngedimvn6vuyqybs64p9mqrfecbyxo1fwhbug-2On1IpowybEsRRUjZfp0jFuEY7SLE3XRaxan0k5zmejcvlqo

J'ai passé deux jours à essayer de comprendre ce qui est mal, mais je ne peux pas voir.

Aussi, je ne pouvais pas trouver tout de la documentation et des exemples.

J'essaie juste de recevoir un jeton.

  1. Suis-je signer les octets de la bonne façon?
  2. Ce qui devrait "champ" paramètre dans claimset ressembler? J'ai essayé "https://www.googleapis.com/auth/devstorage.readonly" et "https://www.googleapis.com/auth/prediction".
  3. Ce "iss" paramètre doit être égal à? Identifiant Client ou e-mail? (essayé les deux)
  4. Quels sont les moyens de trouver mon erreur?
  5. Existe-il des bibliothèques visual C# pour l'Application de Service (pas pour les applications installées ou un client de connexion)?

Je suis fou... Il a de travailler, mais il n'est pas... :-/

source d'informationauteur soulburner | 2012-06-20