У меня есть SPA с бэкэндом Firebase и встроенным доступом к Календарю Google.
Чтобы разрешить пользователю использовать его / ее Календарь Google, я использую метод gapi.auth2.authorize(params, callback)
. (в отличие от обычного потока gapi.auth2.init
и signIn
, поскольку мои пользователи могут связывать несколько учетных записей Календаря)
Документы : gapi.auth2.authorize
Проблема, с которой я столкнулся:
Иногда id_token
, который возвращается с authorize
, содержит адрес электронной почты, а иногда - нет.
Возвращаемый id_token - это длинная строка, которую можно прочитать на внешнем интерфейсе с помощью функции JavaScript, например:
function parseJwt (token) {
let base64Url = token.split('.')[1]
let base64 = base64Url.replace('-', '+').replace('_', '/')
return JSON.parse(window.atob(base64))
}
Когда я анализирую id_token, я ожидаю объект, включающий адрес email
. Однако иногда он вообще не включает свойство email
....
Как я могу получить адрес электронной почты календаря Google пользователя из этого id_token с помощью JavaScript, чтобы я мог сохранить его в базе данных Firestore пользователя?
Пример ожидаемого результата при разборе id_token:
Пример непредвиденного результата (без электронной почты):
Возможная причина:
Я думаю, что это может быть связано с тем, что учетные записи, которые не возвращают электронную почту в качестве учетной записи Google G-Suite? А те, которые возвращают письмо, это обычная учетная запись Gmail? Но я не знаю решения.
PS:
Моя процедура повторной авторизации для постоянных пользователей заключается в том, чтобы просто использовать тот же gapi.auth2.authorize
, но с {prompt: 'none', login_hint: 'emailaddress'}
и заполнить сохраненный адрес электронной почты пользователя. Это отлично работает.