Можно ли получить информацию о профиле в id_token от Google?

При использовании системы проверки подлинности Google OpenIDConnect можно указать email или profile или оба параметра scope. Если вы запрашиваете область email, заявки "email" и "email_verified" будут включены в id_token, который будет возвращен как часть успешного сеанса аутентификации OAuth2.

Вот пример из документации Google:

Полезная нагрузка идентификатора ID

Маркер ID - это объект JSON, содержащий набор пар имя/значение. Вот пример, отформатированный для удобочитаемости:

{"iss":"accounts.google.com", 
 "at_hash":"HK6E_P6Dh8Y93mRNtsDB1Q", 
 "email_verified":"true",
 "sub":"10769150350006150715113082367", 
 "azp":"1234987819200.apps.googleusercontent.com", 
 "email":"[email protected]", 
 "aud":"1234987819200.apps.googleusercontent.com", 
 "iat":1353601026, 
 "exp":1353604926,
 "hd":"example.com" 
}

Однако запрос области profile, по-видимому, не влияет на содержимое id_token. Чтобы получить информацию о профиле, вы должны сделать отдельный HTTP-запрос для отдельной конечной точки (аутентифицированный с помощью access_token, который вы только что получили), чтобы получить документ, который выглядит очень похожим, но с дополнительной информацией:

{
  "kind": "plus#personOpenIdConnect",
  "gender": string,
  "sub": string,
  "name": string,
  "given_name": string,
  "family_name": string,
  "profile": string,
  "picture": string,
  "email": string,
  "email_verified": "true",
  "locale": string,
  "hd": string
}

В идеале я бы предпочел получить информацию о профиле (просто name, фактически), включенную в id_token JWT, вместо того, чтобы делать отдельный вызов. Есть ли способ указать дополнительные поля и включить их в качестве претензий в id_token? Если нет, то почему email обрабатывается специально и возвращается в id_token?

Ответ 1

Начиная с сегодняшнего дня вы получите информацию о профиле при обмене кода на конечной точке маркера (т.е. с помощью "потока кода" ).

Как использовать: добавьте область profile к вашему запросу и убедитесь, что вы используете конечные точки, совместимые с OpenID Connect (те, которые перечислены в https://accounts.google.com/.well-known/openid-configuration).

Ищите утверждения, такие как name и picture в этих ответах идентификатора идентификатора. Как и прежде, если область запроса email находится в вашем запросе, идентификатор ID будет содержать сообщения, связанные с электронной почтой.

Когда вы обновляете токен доступа, каждый так часто ID-токен, который возвращается с новым токеном доступа, также будет содержать эти дополнительные претензии. Вы можете проверить эти поля, и если они присутствуют (и отличаются от того, что вы сохранили), обновите свой профиль пользователя. Это может быть полезно для обнаружения изменений имени или адреса электронной почты.

Ответ 2

Когда запрос создается с response_type=id_token и профилем в области, подобной scope=openid+profile+email, результирующий идентификатор должен содержать утверждения профиля непосредственно в нем.

Это в разделе раздела 5.4 спецификации OpenID Connect, в котором говорится: "... когда не установлен токен доступа (что имеет место для значения response_type id_token), полученные претензии возвращаются в токене идентификатора."

Однако, в небольшом тестировании, которое я сделал с их OAuth 2 Playground, Google, похоже, не ставит претензии профиля в токен идентификатора даже когда response_type=id_token и токен доступа не выпущен. Я утверждаю, что это дефект реализации в части Google и, если не считать, что это исправление (или добавление поддержки "претензий" параметра запроса), похоже, нет способа выполнить то, что вы ищете.

Ответ 3

Ну, это подходящее место для запроса. Мы работаем над поддержкой этой функции и должны скоро ее выпустить (в ближайшие несколько недель). Затем я сделаю обновление для этого ответа.