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.
- Sto firmando i byte nel modo giusto?
- Quale dovrebbe essere il parametro "ambito" in claimset? Ho provato "https://www.googleapis.com/auth/devstorage.readonly" e "https://www.googleapis.com/auth/prediction".
- Quale parametro "iss" deve essere uguale a? ID cliente o indirizzo e-mail? (provato entrambi)
- Quali sono i modi per scoprire il mio errore?
- Esistono librerie C# per l'applicazione di servizio (non per app installate o accesso client)?
sto diventando pazzo ... Deve lavorare, ma non è così ...: -/
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