Как использовать Google Identity для входа с нескольких устройств? - PullRequest
0 голосов
/ 29 марта 2019

Как я могу использовать платформу Google Identity в качестве системы входа / регистрации для собственной службы? В частности - как я могу сделать это и поддерживать логин для одного и того же пользователя с разных устройств?

Использование для веб-службы nodejs без модулей npm: passportjs / googleapis / google-auth-library.

Моя идея: Пользователь открывает страницу myClientApp / login и нажимает кнопку GoogleLogIn, которая попросит его авторизовать мой сервис для определенных областей его учетной записи Google. Затем я получаю токен обновления и доступа к токену и сохраняю его в БД, а затем отправляю токен обновления клиенту с cookie. Всякий раз, когда я вызываю свой собственный сервисный API, я отправляю токен обновления из cookie. Пока у меня есть действительный токен доступа, сохраненный в моей БД, или если срок действия маркера обновления не истек - я считаю пользователя, сопоставившего этот токен обновления, активным сеансом для моей службы.

Проблемы с безопасностью: cookie-атаки, и токен обновления легко доступен из браузера. Может использовать https / шифрование и другие методы для защиты куки и его значения. Тем не менее, кто-то может скопировать cookie-файл с одного компьютера на другой!

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

Может ли OpenID решить эту проблему? Нужно ли использовать JWT? Какой самый безопасный способ использовать регистрацию в Google Identity в моей собственной службе, поддерживая регистрацию на нескольких устройствах для одного и того же пользователя?

1 Ответ

0 голосов
/ 29 марта 2019

Во-первых, убедитесь, что вы действительно понимаете последствия для безопасности того, что вы хотите сделать.

Например, НИКОГДА не отправляйте клиенту токен обновления.

Если вы хотите использовать одни и те же токены для одного и того же клиента на нескольких устройствах, у вас ситуация с курицей и яйцом. Как вы «аутентифицируете» пользователя на каждом устройстве. Откуда вы знаете, что пользователь "Джон" на самом деле является пользователем "Джон", но на другом устройстве в первый раз?

Ваша цель не состоит в том, чтобы торговать удобством ради меньшей безопасности. Вашей целью всегда должна быть безопасность прежде всего, независимо от неудобств.

Лучший подход - позволить Google аутентифицировать и авторизовать пользователя на каждом устройстве. Они должны сделать это только один раз для каждого устройства. Ваши бэкэнд-системы отслеживают токен обновления, выданный для каждого устройства. Затем вы можете сгенерировать токены доступа и жетоны идентификации, когда это необходимо - они истекают через час в любом случае. Сохраните файл cookie на устройстве пользователя, которое идентифицирует их в вашей системе, чтобы вы могли посмотреть, кто они, получить токен обновления, создать новые токены доступа и т. Д.

Существует ограничение на количество токенов обновления, которые можно выдать до аннулирования самых старых. Я думаю, что число составляет 50. Обычно это не проблема. Если токен обновления недействителен, просто верните пользователя обратно в процесс аутентификации и сохраните новый токен.

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

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

Теперь я затрону некоторые ваши вопросы:

Моя идея: пользователь открывает страницу myClientApp / login и нажимает на GoogleLogIn. кнопка, которая попросит его авторизовать мой сервис для определенных областей его учетной записи Google.

Google OAuth не работает таким образом. Вы отправляете пользователя по URL, Google управляет всем отображением и вводом с конечным пользователем. Как только все выполнено, на ваш сервер вызывается URL обратного вызова, и вам передается код. Точные данные зависят от типа используемого потока OAuth.

Затем я получаю токен обновления и доступа и сохраняю его в БД, затем отправьте клиенту токен обновления с файлом cookie.

Во время потока OAuth вы будете запрашивать токен доступа, токен обновления и токен идентификации. Токен обновления сохраняется в базе данных. Никогда не отправляйте этот токен клиенту. Прочитайте мое предложение выше о создании непрозрачного cookie-файла, который вы отправляете клиенту.

Проблемы безопасности: файлы cookie атакуют, и токен обновления легко Доступ из браузера. Может использовать https / шифрование и многое другое методы для защиты куки и его стоимости. Тем не менее, кто-то может скопировать файл cookie с одного компьютера на другой!

Создайте непрозрачный файл cookie, который действителен только для этого устройства, но не для других устройств. Если клиент отправляет вам файл cookie, предназначенный для другого устройства, сочтите это проблемой и аннулируйте все файлы cookie, токены и т. Д. Для этого пользователя на всех устройствах.

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

Я рассмотрел эту проблему выше. Сохраните токен обновления, сгенерированный для каждого устройства в вашей БД. Рассматривайте каждое устройство / токен обновления / cookie как набор.

Может ли OpenID решить эту проблему? Нужно ли использовать JWT? Какой самый безопасный способ использовать логин Google Identity в моем собственном сервисе, пока поддержка нескольких устройств для входа в систему для одного и того же пользователя?

Под Open ID я думаю, что вы имеете в виду Open ID Connect (OIDC). Это уже интегрировано в Google OAuth, и именно эта часть генерирует Identity Token.

Нужно ли использовать JWT?

Google OAuth-токены создаются из подписанных JWT. Однако по большей части вам не нужно беспокоиться о формате токенов. Google предоставляет конечные точки, которые проверяют и декодируют токены Google OAuth.

Какой самый безопасный способ использовать логин Google Identity в моем собственном услуга при поддержке нескольких устройств для входа в систему для одного и того же пользователя?

Я рассмотрел этот вопрос в первой части моего ответа выше.

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