Google Apps и лучшие рекомендации OAuth

Я работаю над интеграцией Google Apps в мое приложение PHP. У меня уже есть система входа в систему, которая назначает идентификатор сеанса пользователю (после ввода имени пользователя и пароля), который сохраняется в базе данных при входе пользователя в систему. Идентификаторы сеанса становятся недействительными после определенного времени бездействия (настраивается пользователем), может быть 5 минут, 15, 60...). Этот идентификатор сеанса передается в URL, чтобы проверить, вошел ли пользователь в систему. При выходе идентификатор сеанса удаляется из базы данных.

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

Это работает, мои пользователи могут войти в систему, используя свою учетную запись Google, и я могу запрашивать API, используя сохраненный access_token, однако некоторые вещи кажутся неуклюжими, из-за чего я не уверен в своем рабочем процессе:

  • Если вы Force_approval вы получаете refresh_token, я чувствую, что я должен использовать этот токен обновления, чтобы получить новый токен доступа, вместо удаления старого из базы данных и ввода нового, когда пользователь снова входит в систему. С другой стороны, при входе в систему я еще не знаю, кто это, поэтому не знаю, какой токен обновления использовать. Может быть, я неправильно понимаю, для чего нужен токен обновления. Кроме того, я на самом деле не хочу форсировать одобрение каждый раз, поэтому я даже не могу использовать refresh_token в этом случае.

  • Как уже было сказано, пользователи могут определить, как долго продлится их сеанс, однако срок действия google access_token всегда истекает через 3600 секунд. Было бы очень глупо, если бы пользователи часами работали в системе, а после этого Google API внезапно выходил из строя, заставляя их снова войти в систему. На игровой площадке Google OAuth отображается флажок "Токен автообновления до истечения срока его действия", но я не вижу, как это сделать. Должен ли я использовать токен обновления здесь? Или просто запросить новый токен в фоновом режиме (если я не форсирую одобрение)?

  • В настоящее время я использую запрос информации о пользователе (https://www.googleapis.com/oauth2/v2/userinfo), чтобы найти идентификатор пользователя, но я также могу использовать информацию токена (https: //www.googleapis. ком /oauth2/v1/tokeninfo). Tokeninfo не отображается на игровой площадке oauth, но результат показывает, как долго токен остается в силе (однако я также могу рассчитать это сам). Один предпочтительнее другого?

  • Я сохраняю весь объект json в базе данных (access_token, id_token, expires_in и token_type), но я чувствую, что мое приложение будет по-прежнему работать идеально, если я сохраню только access_token (единственная проблема, которую я предвижу, это изменение времени expires_in). Нужно ли хранить id_token например?

Мне иногда не хватает документации Google (по адресу developers.google.com), и если кто-то знает какие-либо другие хорошие источники информации, они меня тоже интересуют.

1 ответ

Решение

Я думаю, это могло бы помочь, если бы вы взглянули на последние спецификации OpenID Connect, откуда берутся такие понятия, как конечная точка userinfo. OpenID connect построен на основе OAuth 2. Там довольно много, но все же, вероятно, стоит посмотреть. Эта статья блога также очень хороша (как и другие в том же блоге).

К сожалению, я не думаю, что реализация Google в настоящее время соответствует последним черновикам спецификаций, поэтому, возможно, она станет движущейся целью в течение некоторого времени. Эти вещи сильно изменились за последний год.

Я согласен с вашей первой точкой зрения, что вы должны получать новый токен доступа каждый раз, когда вы аутентифицируете пользователя, а не обновлять старый. Вы не знаете, кто пользователь, пока он не вошел в систему и не предоставил вам токен доступа. Как правило, срок службы токена доступа не связан с сеансом пользователя. После публикации ваше приложение может теоретически использовать его для доступа к ресурсам независимо от присутствия пользователя. Если вы хотите продолжить доступ к ресурсу после истечения срока действия токена, вам необходимо отправить токен обновления в этот момент, чтобы получить новый токен доступа. Боюсь, я не знаю, для чего нужна функция автообновления.

Я считаю, что Google tokeninfo аналогично check_id конечная точка OpenID connect, но принимает либо токен доступа, либо токен id, а не только последний. Обратите внимание, что время истечения этих двух может отличаться. Как правило, вы сможете получить более подробные данные пользователя из userinfo конечная точка, чем от check_id, который обычно возвращает голое user_id,

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

Другие вопросы по тегам