как получить электронную почту после использования 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();
- Добавьте «https://www.googleapis.com/auth/userinfo.email» в области видимости.
- В обратном вызове вы будете кодировать. Получите токены json из этого кода, используя
oauth2Client
. - Этот json содержит
id_token
который в основном является токеном jwt, проанализируйте его и получитеemail
.