2016-11-28 1 views
0

Я использую Google ID tokens для входа пользователей в свой веб-сервис. В рамках проверки маркера, который он получает от Google, вебсервис проверяет, что email_verified = true в полезной нагрузке токена.email_verified = false в токене ID от Google

Некоторые из моих пользователей signed up for a Google-account со своим адресом электронной почты, отличным от Gmail, а не с Google Apps. Они нажали ссылку в письме, отправленном Google после регистрации, чтобы подтвердить свой адрес электронной почты.

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

Что это значит и может/я должен игнорировать это при проверке токена?

+0

Если проверки того, что пользователи имеют правильный адрес учетной записи/электронной почты, то не вы, вероятно, не следует игнорировать. Как вы достигаете этого входа? Я не пробовал, но если mail_verified возвращается как часть областей профиля, и у пользователей, о которых идет речь, у вас нет аккаунтов Google+, я думаю, что он даже вернется. – DaImTo

+0

Если электронное письмо было проверено пользователем, тогда мы должны возвращать true в этом заявлении. Нам нужно изучить это. Если возможно, вы можете отправить мне адрес электронной почты пользователя через мой профиль G +? – nvnagr

+0

@nvnagr Я отправил вам два примера через G + – Rob

ответ

0

Есть несколько различных ways, в котором вы можете проверить целостность ID маркера на стороне сервера:

  1. «вручную» - постоянно загрузки открытых ключей Google, проверки подписи, а затем каждый поле, включая iss; основное преимущество (хотя и небольшое, на мой взгляд) я вижу здесь, что вы можете свести к минимуму количество запросов, отправленных в Google.
  2. «Автоматически» - сделать GET на конечной точке Google, чтобы проверить этот маркер https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. Использование библиотеки Google API клиента - как official one.

Вот как это может выглядеть:

private const string GoogleApiTokenInfoUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}"; 

public ProviderUserDetails GetUserDetails(string providerToken) 
{ 
    var httpClient = new MonitoredHttpClient(); 
    var requestUri = new Uri(string.Format(GoogleApiTokenInfoUrl, providerToken)); 

    HttpResponseMessage httpResponseMessage; 
    try 
    { 
     httpResponseMessage = httpClient.GetAsync(requestUri).Result; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 

    if (httpResponseMessage.StatusCode != HttpStatusCode.OK) 
    { 
     return null; 
    } 

    var response = httpResponseMessage.Content.ReadAsStringAsync().Result; 
    var googleApiTokenInfo = JsonConvert.DeserializeObject<GoogleApiTokenInfo>(response); 

    if (!SupportedClientsIds.Contains(googleApiTokenInfo.aud)) 
    { 
     Log.WarnFormat("Google API Token Info aud field ({0}) not containing the required client id", googleApiTokenInfo.aud); 
     return null; 
    } 

    return new ProviderUserDetails 
    { 
     Email = googleApiTokenInfo.email, 
     FirstName = googleApiTokenInfo.given_name, 
     LastName = googleApiTokenInfo.family_name, 
     Locale = googleApiTokenInfo.locale, 
     Name = googleApiTokenInfo.name, 
     ProviderUserId = googleApiTokenInfo.sub 
    }; 
} 
+0

Я не знал о втором варианте, это отличный совет! У меня был первый вариант. Это не отвечает на проблему, хотя: поскольку email_verified все еще ошибочно в проблемах JWT Google, и мой вопрос заключается в том, должен ли я принять это или нет – Rob

+0

Привет, Alexandru, конечная точка tokeninfo должна помочь с отладкой. id_token был создан, чтобы упростить сервер для его проверки, не делая сетевой вызов, который добавит задержку. Ваше предложение создает проблему безопасности. Очень важная часть проверки маркера идентификатора - это проверка того, что токен предназначен для вашего сервера (поле аудитории). Вызывая tokeninfo, вы только узнаете, что это действительный id_token, но если вы не проверите аудиторию, вы создадите проблему с безопасностью. Лучший вариант - использовать библиотеку. следует избегать использования конечной точки tokeninfo. – nvnagr

+0

Привет @nvnagr, в отношении проверки поля 'aud', если вы посмотрите внимательно, вы можете увидеть на этой странице, что Google также четко заявляет об этом, - и я также делаю это в приведенном примере кода. –

Смежные вопросы