Использование экспериментальной реализации Google OAuth 2.0 для доступа к существующим конечным точкам API - PullRequest
7 голосов
/ 23 марта 2011

Согласно этой документации процесс получения токена доступа OAuth является простым.Я хотел бы увидеть список всех доступных конечных точек API, которые готовы принять токен доступа OAuth 2.0.Но для моих текущих потребностей я хотел бы как-то получить username и email пользователя, использующего токен доступа OAuth 2.0.

Я могу успешно получить, например, данные из этой конечной точки:

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

Но не удалось получить данные с этой конечной точки:

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

Я пробовал подходы как на основе заголовков, так и на основе строк запросов для передачи одного токена доступа.Вот заголовок, который я попробовал:

Authorization: OAuth My_ACCESS_TOKEN

И я даже попробовал версию заголовка авторизации OAuth 1.0, но ... в OAuth 2.0, например, у нас нет секретного токена доступа.Google использует токены на предъявителя в своей реализации OAuth 2.0, поэтому никаких дополнительных учетных данных не требуется.

Кто-нибудь успешно получил имя пользователя и электронную почту, используя Google OAuth 2.0?

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Я нашел ответ, который искал.Мне пришлось конвертировать PHP в MVC, но довольно просто:

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

Мой код песочницы MVC Login выглядит следующим образом.(используя 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);
    }

Возвращенный code является доказательством Authorization токена от пользователя, который затем должен быть превращен в Authentication (accessToken) для доступа к ресурсам.Мой MVC OAuthVerify затем выглядит следующим образом:

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

Чтобы завершить, как все работает, я включил созданную мной утилиту HttpClient на тот случай, если она кому-нибудь понадобится.

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

Снова, это тестовый код, просто для того, чтобы он заработал, я не рекомендую использовать это как есть в производственной среде.

0 голосов
/ 21 апреля 2011

попробуйте это:

curl -k https://www.googleapis.com/userinfo/email -H "Авторизация: OAuth 1 / g5_039aCIAfEBuL7OCyB31n1URYU5tUIDudiWKuxN1o"

вывод: email=name@gmail.com&isVerified=tru

...