2011-03-23 11 views
7

De acuerdo con este documentation, el proceso de recepción del token de acceso OAuth es directo. Me gustaría ver una lista de todos los puntos finales API disponibles que estén listos para aceptar el token de acceso OAuth 2.0. Pero para mis necesidades actuales me gustaría recibir de alguna manera username y email de un usuario que usa el token de acceso OAuth 2.0.Uso de la implementación experimental de OAuth 2.0 de Google para acceder a los puntos finales API existentes

I con éxito puede recibir, por ejemplo, los datos de este criterio de valoración:

https://www.google.com/m8/feeds/contacts/default/full 

Pero no puede recibir datos desde este punto final:

https://www.googleapis.com/userinfo/email 

He intentado tanto cabecera-base y la cadena de consulta de la base enfoques de pasar token de acceso único. Aquí está una cabecera he intentado:

Authorization: OAuth My_ACCESS_TOKEN 

E incluso he intentado versión OAuth 1.0 de Autorización de cabecera, pero ... en OAuth 2.0 no tenemos token de acceso secreta, por ejemplo. Tokens de portador de uso de Google en su implementación de OAuth 2.0, por lo que no se requieren credenciales adicionales.

¿Alguien recibió con éxito nombre de usuario y correo electrónico con Google OAuth 2.0?

+0

Estoy teniendo el mismo problema. ¿Has encontrado alguna solución/solución para esto? – ascandroli

Respuesta

1

encontré la respuesta Estaba buscando. Tenía que convertir a PHP MVC, pero bastante fácil:

http://codecri.me/case/430/get-a-users-google-email-address-via-oauth2-in-php/

Mi MVC Login código de caja de arena se parece a la siguiente. (usando JSON.Net http://json.codeplex.com/)

public ActionResult Login() 
    { 
     string url = "https://accounts.google.com/o/oauth2/auth?"; 
     url += "client_id=<google-clientid>"; 
     url += "&redirect_uri=" + 
      // Development Server :P 
      HttpUtility.UrlEncode("http://localhost:61857/Account/OAuthVerify"); 
     url += "&scope="; 
     url += HttpUtility.UrlEncode("http://www.google.com/calendar/feeds/ "); 
     url += HttpUtility.UrlEncode("http://www.google.com/m8/feeds/ "); 
     url += HttpUtility.UrlEncode("http://docs.google.com/feeds/ "); 
     url += HttpUtility.UrlEncode("https://mail.google.com/mail/feed/atom "); 
     url += HttpUtility.UrlEncode("https://www.googleapis.com/auth/userinfo.email "); 
     url += HttpUtility.UrlEncode("https://www.googleapis.com/auth/userinfo.profile "); 
     url += "&response_type=code"; 

     return new RedirectResult(url); 
    } 

El code devuelto es una prueba de Authorization token del usuario, que luego tiene que ser convertirse en un (accessToken) Authentication acceder a los recursos. Mi MVC OAuthVerify continuación, se parece a:

public ActionResult AgentVerify(string code) 
    { 
     JObject json; 

     if (!string.IsNullOrWhiteSpace(code)) 
     { 
      NameValueCollection postData = new NameValueCollection(); 
      postData.Add("code", code); 
      postData.Add("client_id", "<google-clientid>"); 
      postData.Add("client_secret", "<google-client-secret>"); 
      postData.Add("redirect_uri", "http://localhost:61857/Account/OAuthVerify"); 
      postData.Add("grant_type", "authorization_code"); 

      try 
      { 
       json = JObject.Parse(
        HttpClient.PostUrl(
        new Uri("https://accounts.google.com/o/oauth2/token"), postData)); 
       string accessToken = json["access_token"].ToString(); 
       string refreshToken = json["refresh_token"].ToString(); 
       bool isBearer = 
        string.Compare(json["token_type"].ToString(), 
           "Bearer", 
           true, 
           CultureInfo.CurrentCulture) == 0; 

       if (isBearer) 
       { 
        json = JObject.Parse(
         HttpClient.GetUrl(
         new Uri("https://www.googleapis.com/oauth2/v1/userinfo?alt=json"), 
         accessToken)); 
        string userEmail = json["email"].ToString(); 
       } 
       return View("LoginGood"); 
      } 
      catch (Exception ex) 
      { 
       ErrorSignal.FromCurrentContext().Raise(ex); //ELMAH 
      } 
     } 
     return View("LoginBad"); 
    } 

Para completar cómo funciona todo, he incluido la utilidad HttpClient que creé en caso de que alguien lo necesitaba.

public class HttpClient 
{ 
    public static string GetUrl(Uri url, string OAuth) 
    { 
     string result = string.Empty; 

     using (WebClient httpClient = new WebClient()) 
     { 
      httpClient.Headers.Add("Authorization","OAuth " + OAuth); 
      result = httpClient.DownloadString(url.AbsoluteUri); 
     } 

     return result; 
    } 

    public static string PostUrl(Uri url, NameValueCollection formData) 
    { 
     string result = string.Empty; 

     using (WebClient httpClient = new WebClient()) 
     { 
      byte[] bytes = httpClient.UploadValues(url.AbsoluteUri, "POST", formData); 
      result = Encoding.UTF8.GetString(bytes); 
     } 

     return result; 
    } 
} 

Una vez más, este es el código de prueba sólo para conseguir que funcione, no recomiendo el uso de esta como está en un entorno de producción.

Cuestiones relacionadas