Как получить информацию профиля из Google API в c # - PullRequest
0 голосов
/ 26 марта 2019

Я создаю веб-приложение в vs2017 с помощью c #.Мое требование - разрешить пользователю выполнять вход через Google.Обратите внимание, что я не знаю MVC, поэтому я должен написать код на странице .cs

Я прочитал эту статью https://developers.google.com/identity/sign-in/web/sign-in и реализовал ее соответствующим образом.

Я также создалИдентификатор клиента oAuth и секрет клиента.

Я также установил - Install-Package Google.Apis.Oauth2.v2 -Версия 1.38.0.1532

Я совершенно пуст, как продолжить.Я прочитал так много статей, но я не знаю, как реализовать это в коде на c #.

Как отправить токен доступа в API - есть так много API - которые получат всю эту информациюа именно: имя, фамилия, дата рождения или возраст, номер телефона, адрес электронной почты, адрес, город или город, почтовый индекс?

Я понимаю, что People API доставит мне электронную почту и полное имя.

Буду признателен, если кто-нибудь может помочь мне продвинуться вперед: какой еще пакет nuget я должен установить и как я могу отправить токен в API через код c #

  1. Создал кнопку в Test.aspx page

    function onSignIn(googleUser) {
        var profile = googleUser.getBasicProfile();
        console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead.
         // The ID token you need to pass to your backend:
    
        var id_token = googleUser.getAuthResponse().id_token;
        console.log("ID Token: " + id_token);
    
        console.log('Name: ' + profile.getName());
        console.log('Image URL: ' + profile.getImageUrl());
        console.log('Email: ' + profile.getEmail()); // This is null if the 'email' scope is not present.
    
    
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://localhost:53028/1.aspx');
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.onload = function () {
            console.log('Signed in as: ' + xhr.responseText);
        };
        xhr.send('idtoken=' + id_token);
    }
    

On 1.aspx.cs

string idToken = Request.Form["idtoken"].Trim();

Я хочу имя, фамилию, дату рождения или возраст, номер телефона,Электронная почта, адрес, город или город, почтовый индекс.

Обновление: я добавил эти строки кода в мой файл .cs, и он возвращает имя.

    UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
           new ClientSecrets
           {
               ClientId = "1basa5.apps.googleusercontent.com",
               ClientSecret = "AG0LvAwZAD123"
           },
           new[] { "profile", "https://www.googleapis.com/auth/contacts.readonly" },
           "me",
           CancellationToken.None).Result;

        // Create the service.
        var service = new PeopleService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "M_Test",
        });

        PeopleResource.GetRequest peopleRequest = service.People.Get("people/me");
        peopleRequest.RequestMaskIncludeField = "person.names";
        Person profile = peopleRequest.Execute();

Теперь, что тогда здесь от id_Token?Если я не передам его xhr.send ('idtoken =' + id_token);со страницы клиента?

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я использую эту документацию 1. Сначала вам нужно получить код.Вы должны сгенерировать URL для пользователя следующим образом:

                    var serv = app.Request.Url.GetLeftPart(UriPartial.Authority);
                    var str = "https://accounts.google.com/o/oauth2/v2/auth" +
                        "?scope=" + HttpUtility.UrlEncode("https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email") +
                        "&response_type=" + "code" + 
                        "&access_type=offline" + 
                        "&client_id=" + clien_id +
                        "&state=" + "test" +
                        "&redirect_uri=" + HttpUtility.UrlEncode(serv + "/index.html?action=google");

                    app.Response.Redirect(str);

в действии = Google, вы можете использовать эту функцию для обмена кодом в токене.

static bool GetAccessToken(string access_code, string redirect_url, out string token)
{
    try
    {
        var clien_id = ConfigurationManager.AppSettings["google_app_id"];
        var clien_secret = ConfigurationManager.AppSettings["google_app_secret"];

        var webRequest = (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/oauth2/v4/token");

        webRequest.Method = "POST";

        string parameters = $"code={access_code}&client_id={clien_id}&client_secret={clien_secret}&redirect_uri={redirect_url}&grant_type=authorization_code";

        var byteArray = Encoding.UTF8.GetBytes(parameters);

        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.ContentLength = byteArray.Length;

        var postStream = webRequest.GetRequestStream();

        // Add the post data to the web request
        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();

        var response = webRequest.GetResponse();
        postStream = response.GetResponseStream();

        var reader = new StreamReader(postStream);
        var tmp = reader.ReadToEnd();

        var pat = "\"access_token\"";
        var ind = tmp.IndexOf(pat); 

        if (ind != -1)
        {
            ind += pat.Length;

            ind = tmp.IndexOf("\"", ind);

            if (ind != -1)
            {
                var end = tmp.IndexOf("\"", ind + 1);

                if (end != -1)
                {
                    token = tmp.Substring(ind + 1, end - ind - 1);

                    return true;
                }
            }
        }

        token = tmp;
    }
    catch (Exception e)
    {
        Debug.WriteLine(e);

        token = e.Message;
    }

    return false;
}

Получить профиль пользователя

    var access_code = app.Request.QueryString["code"];

    if (access_code == null)
    {
        return;
    }

    var serv = app.Request.Url.GetLeftPart(UriPartial.Authority);
    var access_token = "";

    if (!GetAccessToken(access_code, HttpUtility.UrlEncode(serv + "/index.html?action=google"), out access_token))
    {
        return;
    }

    var res = "";
    var web = new WebClient();

    web.Encoding = System.Text.Encoding.UTF8;

    try
    {
        res = web.DownloadString("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + access_token);
    }
    catch (Exception ex)
    {
        return;
    }
0 голосов
/ 26 марта 2019

Вы можете позвонить в api people и запросить информацию, просто установите заголовок авторизации и добавьте токен доступа.

GET /v1/people/me HTTP/1.1
Host: people.googleapis.com
Content-length: 0
Authorization: Bearer [Access Token]

Вы на самом деле не используете клиентскую библиотеку .net. Возможно, вы захотите попробовать Веб-авторизация

Обратите внимание, что эта информация будет доступна только в том случае, если пользователь ее заполнил. Есть также несколько других ограничений.

  • Имя, Фамилия (возвращается только имя)
  • Дата рождения или возраст (возвращается только в том случае, если установлен публично)
  • Номер телефона (возвращается, только если установлен публично)
  • Электронная почта (возвращается только с объемом электронной почты)
...