Аутентификация объекта Google Classroom API - PullRequest
0 голосов
/ 22 января 2019

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

  1. Пользователь X входит на мой веб-сайт с помощью Google Login, и я сохраняю объект Google Login этого пользователя (который передаетсяна мой сервер в виде id_token и декодируется для обеспечения подлинности, как подробно описано здесь ) в моей базе данных.Этот ответ в итоге выглядит примерно так: сильно отредактированный объект:

{
   "iss": "accounts.google.com",
   "azp": "redacted-string",
   "aud": "redacted-string",
   "sub": "redacted-string",
   "hd": "redacted-string",
   "email": "redacted-string",
   "email_verified": true,
   "at_hash": "redacted-string",
   "name": "redacted-string",
   "picture": "redacted-string",
   "given_name": "redacted-string",
   "family_name": "redacted-string",
   "locale": "en",
   "iat": redacted-number,
   "exp": redacted-number,
   "jti": "redacted-string"
}
Я хочу сделать что-то в Google Classroom от имени пользователя, например, список классных комнат.Поэтому я прошу разрешения сделать это, отправив их через соответствующий рабочий процесс OAuth2, который предоставляет Google.Затем, получив согласие, я делаю требуемый вызов Google Classrooms API, чтобы составить список классов, и получаю обратно список классов, примерно так:

{
 "courses": [
  {
   "id": "redacted-number",
   "name": "redacted-string",
   "ownerId": "redacted-number",
   "creationTime": "2019-01-09T19:04:28.084Z",
   "updateTime": "2019-01-09T19:04:56.828Z",
   "enrollmentCode": "redacted-string",
   "courseState": "DECLINED",
   "alternateLink": "https://classroom.google.com/c/redacted-string",
   "teacherGroupEmail": "redacted-string",
   "courseGroupEmail": "redacted-string",
   "teacherFolder": {
    "id": "redacted-string"
   },
   "guardiansEnabled": false
  },
  {
   "id": "redacted-number",
   "name": "redacted-string",
   "ownerId": "redacted-number",
   "creationTime": "2019-01-09T19:03:06.321Z",
   "updateTime": "2019-01-09T19:03:05.328Z",
   "enrollmentCode": "redacted-string",
   "courseState": "PROVISIONED",
   "alternateLink": "https://classroom.google.com/c/redacted-string",
   "teacherGroupEmail": "redacted-string",
   "courseGroupEmail": "redacted-string",
   "teacherFolder": {
    "id": "redacted-string"
   },
   "guardiansEnabled": false
  }
 ]
}
Теперь я хотел бы передать эту информацию на мой сервер и сохранить ее в базе данных, связанной с пользователем.Я уже использую JWT для аутентификации пользователя , поэтому, когда запрос достигает моего сервера, я знаю, какой пользователь его отправил.То, что я не знаю, так это то, как доверять объекту Google Classroom, который они мне посылают, на самом деле пришел от Google.не беспокоиться о том, что пользователь распространяет поддельные данные объекта Google в мою базу данных?Я бы подумал, что объекты каким-то образом были подписаны, чтобы мой сервер мог проверить подлинность объектов Google с учетом учетных данных моего приложения и проверенного объекта входа Google в прокси-сервер.Я думаю, что этот процесс будет похож на то, как Google Login позволяет мне проверять подлинность входа на моем сервере.

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

PS Это продолжение этого вопроса , который, к сожалению, так и не получил достойного ответа.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

проблема может вообще не быть проблемой, как вы написали:

Чего я не знаю, так это того, как доверять объекту Google Classroom, который они мне отправляют, на самом деле пришел от Google.

при условии API связи, они даже не отправляют его, но вы получаете его через SSL или TLS (сертификат хоста также может быть проверен , хотя это не требуется, поскольку когда он не совпадает с записью A в DNS, он недействителен). Идентификационные токены пользователей также могут быть проверены; см. документацию .

0 голосов
/ 28 января 2019

Невозможно защититься от того, что действительный пользователь отправляет фальшивые данные на ваш сервер из пользовательского браузера клиента.

Один из вариантов - обновить приложение, чтобы разрешить доступ на стороне сервера к API Google.

Здесь есть документация о том, как это сделать: https://developers.google.com/identity/sign-in/android/offline-access

Если у вас есть доступ к токену доступа по запросам на стороне клиента, вы также можете выполнить следующий шаблон запроса:

1) Клиент отправляет следующий HTTP-запрос конечной точке API на сервере приложений

GET /api/list_courses HTTP/1.1
Host: yourapp.example.com
Content-length: 0
Authorization: Bearer googles_api_access_token_here

2) Конечная точка / api / list_courses на вашем сервере приложений отправляет следующий запрос на сервер API Google:

GET /v1/courses HTTP/1.1
Host: classroom.googleapis.com
Content-length: 0
Authorization: Bearer googles_api_access_token_here

3) Ответ от (2) отправляется обратно на сервер приложений

4) ваш сервер приложений отправляет клиенту список курсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...