как получить электронную почту после использования Google OAuth2 в C#?

Я получаю учетные данные с помощью кода

 static string[] Scopes = { "https://www.googleapis.com/auth/userinfo.email" };

    private static UserCredential GenerateCredential()
    {
        UserCredential credential;
        using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
        {
            // The file token.json stores the user's access and refresh tokens, and is created
            // automatically when the authorization flow completes for the first time.
            string credPath = "token.json";
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
            Console.WriteLine("Credential file saved to: " + credPath);
        }

        return credential;
    }

Как получить электронную почту с этими учетными данными? Я пробовал код

private string GetEmailFromCredentials(UserCredential credential)
    {
        var plusService = new PlusService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "My Application",
        });

        var me = plusService.People.Get("me").Execute();
        var useremail = me.Emails.FirstOrDefault().Value;

        return useremail;
    }

но похоже, что People.Get("я") больше не возможен. Я получаю сообщение об ошибке "Google.Apis.Requests.RequestError Legacy People API ранее не использовался в проекте 618254727025 или отключен"

5 ответов

Решение - получить токен доступа и попробовать https://www.googleapis.com/oauth2/v2/userinfo?access_token=

  • В вашей переменной области действия. Попробуйте просто использовать значение "электронная почта", а не полный адрес https. Ключевые слова области в веб-ссылке разделены пробелами. Вот способ, которым я делаю это, чтобы получить области: адрес электронной почты профиля openid.

  • Чтобы протестировать этот подход, вы можете вручную вставить следующую веб-ссылку в браузер после получения кода доступа:https://www.googleapis.com/oauth2/v2/userinfo?access_token=%5BPASTE КОД ДОСТУПА ЗДЕСЬ] и [ВСТАВИТЬ ЗНАЧЕНИЕ ИЗ НИЖЕ ПЕРЕМЕННАЯ authorizationRequest ЗДЕСЬ]

  • к сведению: я исправлял доступный демонстрационный код: https://github.com/googlesamples/oauth-apps-for-windows.

     // Creates the OAuth 2.0 authorization request.
     string authorizationRequest = string.Format("{0}?response_type=code&scope=openid%20profile%20email&redirect_uri={1}&client_id={2}&state={3}&code_challenge={4}&code_challenge_method={5}",
         authorizationEndpoint,
         System.Uri.EscapeDataString(redirectURI),
         clientID,
         state,
         code_challenge,
         code_challenge_method);
    

Я застрял в этом вопросе несколько дней. И, наконец, благодаря этой ссылке (проверьте, вошел ли пользователь в систему), Я узнал, что ключевой вопрос - ввод параметра «пользователь». Этот «пользователь» должен быть пользователем Windows (вы можете использовать Enviroment.Username), а не программистом или пользователем приложения. GoogleWebAuthorizationBroker.AuthorizeAsync использует это имя пользователя для сохранения своих учетных данных в папке: C:\Users[имя пользователя] \ AppData \ Roaming \Google.Apis.Auth\Google.Apis.Auth.OAuth2.Responses.TokenResponse-[имя пользователя](что-то нравится). Поэтому, если вы скармливаете «пользователя» AuthorizeAsync, сохранение учетных данных может стать проблемой, и ваше приложение будет серьезно зависать или зависать. А позже, когда вы захотите использовать файл cred для получения информации о пользователе и электронной почты, это будет проблематично (серьезное отставание). В моем случае вся информация о пользователе будет отсутствовать, останется только адрес электронной почты. Кроме того, вы должны указать две требуемые области: https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/userinfo.profile". Надеюсь, это поможет.

Вы можете использовать users.getprofile, он вернет адрес электронной почты пользователя, который в настоящее время аутентифицирован.

запрос

 var service = new GmailService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "My Application",
        });

  var user = service.Users.GetProfile("me").Execute;

ответ

{
  "emailAddress": "xxxx1@gmail.com",
  "messagesTotal": 8394,
  "threadsTotal": 1494,
  "historyId": "605503"
}

Люди меня

Правильное использование people.get - "люди / я".

 var request = plusService.People.Get("people/me")
 request.PersonFields("emailAddresses");
 var response = request.Execute();
  1. Добавьте «https://www.googleapis.com/auth/userinfo.email» в области видимости.
  2. В обратном вызове вы будете кодировать. Получите токены json из этого кода, используя oauth2Client.
  3. Этот json содержит id_tokenкоторый в основном является токеном jwt, проанализируйте его и получите email.
Другие вопросы по тегам