2012-06-20 27 views
11

Sto tentando di implementare Google oAuth 2 per gli account di servizio qui descritti: https://developers.google.com/accounts/docs/OAuth2ServiceAccount su UnityScript (o C# - non importa perché entrambi utilizzano lo stesso Mono .NET classi).Google oAuth 2.0 (richiesta token JWT) per l'applicazione di servizio

Ho trovato argomenti simili qui: Is there a JSON Web Token (JWT) example in C#? web-token-jwt-example-in-c ma non ho ancora avuto successo. intestazione

Pugno di tutto, ho generato e claimset (che sono simili nella documentazione google)

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

Il risultato è (separato con nuove linee per chiarezza):

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

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

01.235.164,106 mila

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

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

"exp": 1.340.222,315 mila,

"IAT": 1.340.218,715 mila}

Base -64 metodi di codifica:

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

Quindi sto facendo un 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; 

E poi formando la richiesta:

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

E tutto quello che ottiene è "Errore 400: Bad richiesta".

I dati codificati assomiglia (interruzioni di riga aggiunte per chiarezza):

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnMnJlYnAwYThmbjlsMDJrOW50cjZ1NW80YThscDIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTM0MDIyMjMxNSwiaWF0IjoxMzQwMjE4NzE1fQ.

lIFg7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4reTVVAtuW06DeGsdcBMNgEdIMvN6VuYQybs64p9mqrfECBYxO1FWHbUG-2On1IpowybEsRRUjZfp0jFuEY7SLE3XRaXan0k5zmejcvLQo

Ho passato due giorni a cercare di capire ciò che è sbagliato, ma non riesco a vedere.

Inoltre, non sono riuscito a trovare documentazione ed esempi adeguati.

Sto provando solo a ricevere un token.

  1. Sto firmando i byte nel modo giusto?
  2. Quale dovrebbe essere il parametro "ambito" in claimset? Ho provato "https://www.googleapis.com/auth/devstorage.readonly" e "https://www.googleapis.com/auth/prediction".
  3. Quale parametro "iss" deve essere uguale a? ID cliente o indirizzo e-mail? (provato entrambi)
  4. Quali sono i modi per scoprire il mio errore?
  5. Esistono librerie C# per l'applicazione di servizio (non per app installate o accesso client)?

sto diventando pazzo ... Deve lavorare, ma non è così ...: -/

+0

Sto attraversando un periodo difficile anche l'implementazione dell'autenticazione degli account di servizio in C#! Puoi confermare per me che hai utilizzato correttamente i campi grant_type e assertion_type come sono mostrati nell'esempio? grazie – Nick

risposta

7

La soluzione era che nel codice di richiesta tutti i tagli devono essere backslash

SBAGLIATO:

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

CORRETTO:

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

soulburner sei il mio eroe! Grazie mille! Vorrei poter sopravvivere 10 volte: D –

1

Ho risposto a una domanda simile con una proposta di un molto semplice ma l'attuazione lavorare con il .NET API OAuth di Google here

Problemi correlati