Как получить адрес электронной почты из id_token клиент Google Javascript API (GAPI) - PullRequest
0 голосов
/ 02 мая 2018

У меня есть 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:

expected result

Пример непредвиденного результата (без электронной почты):

unexpected result

Возможная причина:

Я думаю, что это может быть связано с тем, что учетные записи, которые не возвращают электронную почту в качестве учетной записи Google G-Suite? А те, которые возвращают письмо, это обычная учетная запись Gmail? Но я не знаю решения.

PS:
Моя процедура повторной авторизации для постоянных пользователей заключается в том, чтобы просто использовать тот же gapi.auth2.authorize, но с {prompt: 'none', login_hint: 'emailaddress'} и заполнить сохраненный адрес электронной почты пользователя. Это отлично работает.

1 Ответ

0 голосов
/ 02 мая 2018

Если вы хотите авторизовать клиент JavaScript с помощью gapi.auth2.authorize, а также указать адрес электронной почты, для которого авторизован пользователь, обязательно включите email в область действия параметров gapi.auth2.authorize(params, callback)! !

Правильный пример использования JavaScript gapi для авторизации календаря Google:

Шаг 1.
Включить в основной заголовок HTML:

<script type=text/javascript src="https://apis.google.com/js/api.js" async defer=defer></script>

Шаг 2.
(один раз) Загрузите клиент:
window.gapi.load('client', callbackFunction)
Внимание! Загружайте только клиент!

Шаг 3.
(один раз) Инициализировать клиент для использования Calendar API.
Внимание! Включайте только документы для обнаружения!

let calDocs = {
    discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest']
}
window.gapi.client.init(calDocs)
    .then(_ => {
      console.log('Calendar client initialised')
    })
  })
},

Шаг 4.
(один раз) Авторизуйте клиент gapi для вызовов API с помощью
gapi.auth2.authorize(params, callbackFunction)
Внимание! Область действия - это строка с пробелами! Включение электронной почты в область действия. НЕ включайте документы по открытию здесь!

params = {
    client_id: clientId,
    scope: 'https://www.googleapis.com/auth/calendar email',
    response_type: 'permission id_token'
}

Вы можете повторить gapi.auth2.authorize перед любым вызовом API с дополнительными параметрами: {prompt: 'none', login_hint: 'emailaddress'}, чтобы обновить токен доступа пользователя. Это не будет показывать пользователю никакого запроса, если он уже авторизовался один раз для вашего домена.

...