2012-06-20 27 views
11

Estoy tratando de implementar Google oAuth 2 para las cuentas de servicio descritas aquí: https://developers.google.com/accounts/docs/OAuth2ServiceAccount en UnityScript (o C# - eso no importa porque ambos usan el mismo Mono .NET clases).Google oAuth 2.0 (solicitud de token JWT) para la aplicación de servicio

He encontrado un tema similar aquí: Is there a JSON Web Token (JWT) example in C#? web-token-jwt-example-in-c pero todavía no tengo éxito. cabecera

Puño de todo, he generado y claimset (que son al igual que en la documentación de Google)

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

El resultado es (separar con nuevas líneas para mayor claridad):

{ "ALG": "RS256", "típico": "JWT"}

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

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

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

"CAD": 1340222315,

"IAT": 1340218715}

Base -64 métodos de codificación:

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

Luego estoy haciendo un signo 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; 

Y entonces la formación de la solicitud:

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

Y todo lo que consigo es "Error 400: Solicitud incorrecta".

Los datos codificados se parece a los saltos de línea (añadido para mayor claridad):

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpc3MiOiI0MjU0NjY3MTkwNzAtMWRnMnJlYnAwYThmbjlsMDJrOW50cjZ1NW80YThscDIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTM0MDIyMjMxNSwiaWF0IjoxMzQwMjE4NzE1fQ.

lIFg7-Og_BcC5qpICLt7USwGIHUOz-vV4ADNq0AWhuRtsvFrbZn5mxk4n9r5qU66q4reTVVAtuW06DeGsdcBMNgEdIMvN6VuYQybs64p9mqrfECBYxO1FWHbUG-2On1IpowybEsRRUjZfp0jFuEY7SLE3XRaXan0k5zmejcvLQo

He pasado dos días tratando de averiguar lo que está mal, pero no puedo ver.

Además, no pude encontrar documentación ni ejemplos adecuados.

Estoy tratando de recibir un token.

  1. ¿Estoy firmando los bytes de la manera correcta?
  2. ¿Cómo debería ser el parámetro "scope" en claimset? Intenté "https://www.googleapis.com/auth/devstorage.readonly" y "https://www.googleapis.com/auth/prediction".
  3. ¿Con qué parámetro "iss" debería ser igual? ¿Identificación del cliente o dirección de correo electrónico? (intenté ambos)
  4. ¿Cuáles son las formas de descubrir mi error?
  5. ¿Hay alguna biblioteca C# para la aplicación de servicio (no para las aplicaciones instaladas o el inicio de sesión del cliente)?

estoy volviendo loca ... Tiene que funcionar, pero no es así ...: -/

+0

¡Estoy teniendo dificultades para implementar la autenticación de la cuenta de servicio en C#! ¿Puede confirmarme que utilizó con éxito los campos grant_type y assertion_type como se muestran en su ejemplo? gracias – Nick

Respuesta

7

La solución fue que en el código de solicitud de todas las barras tienen que ser de barra invertida

MAL:

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

CORRECTO:

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

soulburner eres mi héroe! ¡Muchas gracias! Desearía poder votar 10 veces: D –

1

he respondido a una pregunta similar con una propuesta de una aplicación muy simple, pero trabajando con el .NET Google OAuth API here

Cuestiones relacionadas