Доверие к объектам ответа Google API и праву собственности

Я успешно реализовал вход через Google в свое веб-приложение, используя OAuth 2.0 для клиентских веб-приложений. . Для большинства нужд мне просто нужно, чтобы пользователь один раз вошел в мое приложение, и я передаю id_token обратно на свой сервер для его аутентификации и возвращаю токен JWT на внешний интерфейс в случае успеха. Пользователю не нужно входить в систему каждый раз, когда он посещает страницу, сохраняя этот токен JWT в браузере.

Теперь я хочу добавить в свое приложение некоторые дополнительные возможности, которые требуют от меня действий от имени пользователя, поэтому мне нужно поэтапно запрашивать дополнительные области действия. Думаю, я разбираюсь в этом аспекте.

На стороне клиента я получаю согласие на использование API Google от имени пользователя, а затем использую возвращаемый токен Bearer, чтобы сделать запрос к этому API, а затем получаю объект от Google.

Теперь я хочу передать этот объект на свой сервер (мой внутренний сервер), чтобы сохранить некоторую информацию в моей базе данных, связанную с пользователем, вошедшим в мою систему. Как мне аутентифицировать на моем сервере, что объект, который я получил от Google через прокси через браузер, на самом деле принадлежит пользователю, который передает его на мой сервер.

Что может помешать кому-то использовать cURL со своим действительным токеном JWT на моем сервере и передать какой-либо произвольно созданный объект Google, созданный им самим. Я не вижу ничего в объекте ответа Google, что я мог бы проверить его подлинность на моем сервере (как я могу с id_token, который я получаю от их успешного входа в систему, как описано здесь). Возможно, в объекте есть поле «под» (которое, я думаю, является понятием личности Google), которое, по крайней мере, позволяет мне узнать, что он принадлежит пользователю Google, если я могу доверять подлинности объекта в первую очередь.

Может ли кто-нибудь исправить меня и дать мне достаточно интуитивную ментальную модель, чтобы организовать мои мысли, и сказать мне, не ошибаюсь ли я в своих опасениях или подхожу к этому с совершенно неправильной точки зрения?


person vicatcu    schedule 09.01.2019    source источник
comment
Когда вы создаете JWT, который вы передаете пользователю, подпишите его с помощью пары открытых ключей. Это называется JWS, что является обычным вариантом использования JWT. Теперь ваш JWT нелегко подделать. Вы также можете включить информацию о пользователе в свой JWT. Когда вы получили JWT от пользователя, проверьте подпись JWT. После проверки вы можете доверять тому, что хранится в JWT.   -  person John Hanley    schedule 10.01.2019
comment
@JohnHanley действительно ли это решает вопрос о подлинности публикуемого объекта Google? Я знаю, что могу аутентифицировать запрос, сделанный законным пользователем моей системы, потому что JWT включен в заголовки, как вы предлагаете, но как я узнаю, что публикуемый объект действительно поступил из Google?   -  person vicatcu    schedule 11.01.2019
comment
Вы можете проверить токен Google OAuth, вызвав эту конечную точку (пример curl): `curl googleapis.com/oauth2/v1/tokeninfo?access_token=ACCESS_TOKEN   -  person John Hanley    schedule 11.01.2019
comment
Если вы на самом деле используете Google JWT, вы можете проверить подпись. Google опубликовал пару открытых ключей. Если вы создадите новый вопрос, у меня есть код Python, который показывает, как проверить подпись Google JWT.   -  person John Hanley    schedule 11.01.2019