Google Apps и лучшие рекомендации OAuth - PullRequest
5 голосов
/ 09 марта 2012

Я работаю над интеграцией 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 отображается флажок «Токен автообновления до истечения срока его действия», но я не вижу, как это сделать. Должен ли я использовать токен обновления здесь? Или просто запросить новый токен в фоновом режиме (если я не форсирую одобрение)?

  • В данный момент я использую запрос userinfo (https://www.googleapis.com/oauth2/v2/userinfo), чтобы найти идентификатор пользователя, но я также могу использовать tokeninfo (https://www.googleapis.com/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 Ответ

4 голосов
/ 10 марта 2012

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

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

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

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

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

...