Изменение разрешений с помощью Google OAuth

Я обновляю учетные записи, чтобы использовать новую область действия plus.login, поэтому я протестировал добавление пользователя только с областью действия userinfo, а затем повторный вход в систему с добавлением plus.login. В результате была введена новая запись в авторизованной панели доступа, а токен доступа, возвращенный из последнего вызова, имел только разрешение userinfo. Я проверил это, выполнив проверенный вызов токена, а также попытавшись составить список людей.

Является ли это ожидаемым поведением, и если да, то должен ли я заранее отозвать старый токен? Я вижу, что это возможно с действием /revoke. Удаление токена Oauth на стороне сервера

Обновление: актуальная суть. Это использует драгоценный камень Ruby Omniauth. На самом деле я не уверен, как пользователь может когда-либо видеть более 1 записи в авторизованной панели доступа, но в данном случае я мог видеть 2. И после вчерашнего тестирования различных сценариев у меня было около 6 записей. все принадлежат одному и тому же приложению! Обратите внимание, что я никогда не менял идентификатор клиента, и на самом деле у меня есть только один идентификатор клиента.

Я надеюсь, что описанную мной ситуацию смогут повторить другие; это просто вопрос взлома URL-адреса на стороне Google, чтобы удалить область plus.login, а затем снова войти в систему, сохранив URL-адрес как есть.

Обновление (2): я также обнаружил эту ошибку: "Вы не должны запрашивать информацию о пользователе. profile или plus.me в сочетании с этой областью действия, поскольку они неявно включены и создадут запутанный диалог разрешений для вашего пользователя». На самом деле, это больше, чем просто проблема с разрешениями UX; кажется, что Google на самом деле не будет хранить область «plus.me» для пользователя, поэтому это означает, что он всегда будет показывать диалоговое окно разрешений OAuth, даже если пользователи уже предоставили разрешения (я думаю, потому что он выполняет простую проверку на равенство и замечает плюс .me запрашивается, но не сохраняется против пользователя).

Обновление (3): ошибка с использованием неправильного входа в систему была вызвана тем, что мой код делал что-то вроде user.login || user.signup без обновления данных токена при входе в систему. Итак, теперь он обновляет токен доступа и токен обновления после каждого входа в систему. (Я до сих пор не понимаю, почему для каждой комбинации клиент-пользователь должно быть более одного токена.)


person mahemoff    schedule 15.03.2013    source источник


Ответы (2)


Возможно, вы не отзываете токен для своего ранее аутентифицированного клиента перед выпуском нового?

Вы можете проверить, что отзыв после обновления области работает со следующими демонстрациями JavaScript:

  1. Авторизуйтесь с помощью этой страницы. (Не отключайте авторизованный клиент)
  2. Обновите свою авторизацию, используя эту страницу, которая включает область календаря в качестве примера и имеет тот же клиент.
  3. Теперь, если вы посмотрите на страницу выданных субтокенов авторизации, вы увидите два записи, соответствующие каждому клиенту.
  4. Отменить со второй страницы, обновив и нажав кнопку отключения.
  5. Вернитесь на страницу выданных субтокенов авторизации. Оба набора выпущенных авторизованных субтокенов больше не используются.

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

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

Однако, как видно из демонстрации, отзыв токенов из того же клиента API приведет к отзыву дополнительно выпущенных токенов аутентификации, поэтому вам не нужно беспокоиться об отзыве ранее выпущенных токенов.

Лучшая причина для отзыва старых токенов (например, ваш токен обновления с областью действия userinfo.email) заключается в том, что позже вы можете попытаться сделать вызов API для новой области, используя этот токен, даже если этот токен не был обновлен для включения дополнительные области и могут привести к странным ошибкам.

И последнее замечание: мы надеемся, что пользователи привыкнут просматривать свои выданные токены авторизации на странице управления приложениями в Google+ который лучше справляется с дедупликацией экземпляров подключенных приложений.

person class    schedule 15.03.2013
comment
Спасибо, эта демонстрация в основном повторяет большую часть того, что меня смутило, то есть есть вторая запись, поскольку я думал, что обновление просто перезапишет ее, но я вижу, что это ожидаемое поведение. (Хотя я до сих пор не уверен, почему возвращался не тот токен; я проверю это еще раз.) У меня все тот же практический вопрос о том, как лучше всего обновлять существующие токены, поскольку в идеале мне нужен только один токен (даже если я могу точно совершать звонки с правильным токеном каждый раз, это не нужно). Итак, я предполагаю, что мой сервер должен отозвать все остальные токены, когда вернется обновленный токен? - person mahemoff; 15.03.2013
comment
К ответу добавлены дополнительные примечания, потому что мне не хватило места в комментарии. - person class; 15.03.2013
comment
Спасибо, это очень полезно, чтобы подтвердить, что другие должны быть отозваны. Похоже, вы предлагаете, чтобы когда пользователь нажимал кнопку входа в систему, мой сервер должен сначала попытаться отозвать любой существующий токен и запросить новый только после получения успешного ответа от сервера Google. Другими словами, между запросом пользователя и ответом сервера приложения о перенаправлении в Google происходит двусторонний обмен данными между серверами. - person mahemoff; 15.03.2013
comment
другие должны быть отозваны. Это предназначено только для старых клиентов и должно быть сделано, чтобы избежать появления токенов обновления, которые ведут себя не так, как вы ожидаете. Однако отзыв токена у того же клиента (например, вы добавляете службу в консоль API для обновления запрошенных областей, а ваш clientid/secret остается прежним) после получения дополнительного токена приведет к отзыву вашего нового токена, как показано в демонстрации. - person class; 15.03.2013

Это не похоже на правильное поведение. Можете ли вы получить маркер доступа из более позднего вызова и подключить его к https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=TOKEN_GOES_HERE — здесь будут показаны области, для которых он авторизован.

На какой платформе вы также реализовывали? Если у вас есть фрагмент, который может помочь!

Обновление: попытался добавить plus.login после предыдущей аутентификации, и я получил новый диалог согласия, так что все выглядело довольно гладко. Может проблема в конкретном клиенте?

person Ian Barber    schedule 15.03.2013
comment
Я проверил токен; это то, что я имел в виду под проверкой, и он вернулся с исходной запрошенной областью (без plus.login). Добавлена ​​ссылка Gist с кодом по запросу. - person mahemoff; 15.03.2013
comment
С обновлением что дальше было? Видели ли вы 2 записи в панели доступа (t.co/BIv3RN67MK), и какая область возвращается, когда вы все /токенинфо. - person mahemoff; 15.03.2013