Доверяване на обекти и собственост на Google API Response

Успешно внедрих Google Login в моето уеб приложение, използвайки OAuth 2.0 за уеб приложения от страна на клиента. За повечето нужди просто трябва потребителят да влезе в моето приложение веднъж и аз предавам id_token обратно на моя сървър, за да го удостоверя, и връщам JWT токен на предния край при успех. Потребителят не трябва да влиза всеки път, когато посещава страницата, като съхранява този JWT токен в браузъра.

Сега искам да вградя някои допълнителни възможности в моето приложение, които изискват да действам от името на потребителя, така че трябва да постепенно поискайте допълнителни обхвати. Мисля, че се справям с този аспект.

От страна на клиента получавам съгласие да използвам API на Google от името на потребител и след това използвам токена на носителя, който получавам, за да направя заявка към този 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