Я работаю над веб-приложением, в котором мне нужно попросить пользователя предоставить доступ к его календарю Google (чтобы я мог читать и создавать события от его имени).
Чтобы подвести итог моего вопроса, рассмотрим поток oauth:
клиент (сеанс) -> бэкэнд (сеанс) -> google (предоставление доступа) -> бэкэнд (как сделать Я знаю пользователя на этом шаге для сохранения refresh_token?)
Возможное фиктивное решение:
клиент (сеанс) -> бэкэнд (сеанс) -> google (предоставление доступа) -> клиент (сеанс) -> бэкэнд (сеанс)
Подробнее
Вот поток по умолчанию:
- пользователь входит в мое веб-приложение ( клиент )
- веб-приложение затем просит пользователя запустить поток oauth2 ( клиент )
- , поэтому пользователь нажимает кнопку «Запустить поток авторизации», которая отправляет запрос «Запустить поток авторизации» в мой бэкэнд ( клиент )
- на сервере есть oauth-клиент, который генерирует URL-адрес запроса и перенаправляет пользователя на этот URL-адрес ( backend ):
const authUrl = new google.auth.OAuth2(clientId, secret, redirectUrl)).generateAuthUrl(options)
res.redirect(authUrl)
- перенаправляет пользователя на страницу согласия Google. ( Google )
- Как только пользователь получил разрешение, он перенаправляется обратно на URL, указанный в клиенте OAuth2 ( backend , моя конечная точка "обратного вызова")
- на данный момент мне нужно сохранить refresh_token в расположении базы данных пользователя. ( бэкенд )
И вот вопрос: как я понимаю в «обратном вызове», что это все тот же пользователь, который запустил поток?
Это может звучать глупо, но я застрял с этим.
Я понимаю, что сессия должна решить эту проблему, но, поскольку "обратный вызов" запускается сервером Google и является моей конечной точкой бэкэнда (а не страницей браузера), сеанса не будет, если я что-то упустил.
В моем понимании, это то, как это может быть реализовано, что сначала включает перенаправление в браузер:
- пользователь входит в мое веб-приложение, и я устанавливаю cookie сеанса ( клиент )
- пользователь запускает поток oauth2 ( клиент / серверная часть )
- обратный вызов затем перенаправляет обратно на некоторую фиктивную страницу на стороне клиента ( google )
- эта фиктивная страница извлекает код авторизации, переданный из Google, и отправляет его в мою конечную точку бэкэнда, пропуская сеанс по пути ( клиент )
- теперь сервер знает, кто выполнил «обратный вызов» ( backend )
Но это не похоже на хороший подход со всем этим между клиентом и бэкэндом
Так есть ли способ идентифицировать пользователя во время обратного вызова, не задействуя браузер в середине процесса? Как это сделать?
Я работаю с nodejs и выражаю в случае, если это имеет значение
Спасибо