2012-04-04 7 views
7

Несколько месяцев назад я ушел из Google App Engine. Но я все еще полагаюсь на это для аутентификации, потому что мои пользователи идентифицируются по их атрибуту user_id в GAE.Перенос пользователей из Google App Engine в Google OpenID

С этой целью мои (сейчас внешние) приложения перенаправляют пользователя в приложение Google App Engine с использованием зашифрованного, подписанного и запрошенного по времени запроса на вход. Затем приложение GAE выполняет вход в систему с помощью сервиса «Пользователи» GAE. После успешного входа в систему GAE пользователь снова перенаправляется с помощью зашифрованного, подписанного и timestamped ответа на внешнее приложение. Рудиментарная реализация может быть найдена here и here. Как вы можете видеть, это очень просто и полагается на тяжелый криптографический код, что приводит к плохой производительности.

Мои внешние приложения, в данном случае приложения Django, хранят user_id в поле пароля таблицы пользователя. Помимо user_id, я получаю только адрес электронной почты от GAE для хранения имени пользователя и электронной почты в Django.

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

Я бы предпочел решение, основанное на службе OpenID Google, так что для пользователя нет никакой разницы. Это также является предпочтительным, потому что мне все равно нужно отправить пользователя в Google, чтобы получить токены AuthSub для API календаря Google.

Проблема в том, что я не смог найти способ получить атрибут GAE user_id данной учетной записи Google без использования GAE. OpenID и все другие протоколы аутентификации используют разные идентификаторы.

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

Заранее благодарен!

ответ

1

AFAIK, единственным распространенным идентификатором между учетными записями Google и Google OpenID является электронное письмо.

  1. Получайте email, когда пользователь заходит в аккаунт Google через текущую настройку gae. Используйте User.email(). Сохраните это письмо вместе с данными пользователя.

  2. Когда у вас есть электронные письма всех (большинства) пользователей, переключитесь на Google OpenID. Когда пользователь входит в систему, получите адрес электронной почты и найдите этого пользователя в базе данных.

+0

Спасибо за ответ. Проблема заключается в том, что пользователь мог изменить свой адрес электронной почты тем временем, например, с адреса, отличного от gmail, до gmail или другого не-gmail. Я испытал это раньше и должен был вручную предоставить пользователям возможность связаться со мной и повторно связать свою старую учетную запись и связанные с ней данные. User_id - это статический идентификатор, который никогда не изменяется, и я действительно хотел бы убедиться, что никто не останется позади. – mback2k

0

У Google есть уникальный идентификатор, который возвращается как параметр с успешным запросом аутентификации OpenID - * openid.claimed_id *. Если вы переключитесь на использование OpenID, вы можете поменять user_id для этого параметра при первом входе пользователя в систему с использованием нового метода без того, чтобы пользователь не заметил ничего другого в своем опыте регистрации.

Описана документация для процесса аутентификации here. Я бы рекомендовал использовать гибридный подход OpenID + OAuth, чтобы вы могли связать токен запроса с заданным идентификатором, а затем, после возврата, убедитесь, что openid.claimed_id соответствует вашему оригинальному маркеру запроса.

+0

Спасибо. Да, но как я могу сопоставить существующих пользователей с их учетными записями. Дело в том, что адрес электронной почты или псевдоним не уникален и не статичен. Почти 15% моей пользовательской базы используют адреса не-gmail/googlemail.com, которые могут меняться в любой момент времени. В настоящее время я использую user_id как единый фактор для идентификации пользователя, но сохраняю электронную почту и псевдоним для информации и целей контакта. – mback2k

+0

Возможны два подхода. Во-первых, вы просто связываете свою учетную запись с вашей системой с любой учетной записью google, которую они регистрируют в первый раз. Два (более безопасных) в течение переходного периода вы сначала аутентифицируете пользователей, используя текущий метод, а затем снова используя метод OpenID. –

+0

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

2

Лучший способ сделать это - показать пользователям «межстраничную» миграцию, которая перенаправляет их поставщику Google OpenID и предлагает им войти в систему. Как только они будут подписаны в обоих местах, вы можете сопоставить две учетные записи и позволить им входить в OpenID в будущем.

+0

Спасибо за ответ, но, как я уже указывал в других комментариях: мне бы очень хотелось избежать переходной фазы, периода миграции или чего-то подобного. И я также хочу убедиться, что никто не остался позади. (Я знаю, что ваше решение в порядке, но другие могут и не быть.) Одна вещь, которую я должен добавить, состоит в том, что, хотя я храню user_id в поле пароля моей таблицы Django auth_user, user_id не зашифрован или не хэширован. Если API, чтобы преобразовать их в идентификаторы OpenID или что-то подобное, я мог бы легко мигрировать. – mback2k

+0

@ mback2k То, что вы ищете, не существует. Идентификатор пользователя, возвращаемый API-интерфейсом App Engine, является внутренним идентификатором; нет внешнего соответствия ему или каким-либо образом преобразовать его во внешний идентификатор. –

+0

Хорошо, я вижу. Спасибо за ответ. Может ли это быть чем-то, что команда GAE могла бы изучить в будущем? Как элемент открытых усилий по импорту/экспорту данных и миграции? – mback2k

1

Почему бы вам не попробовать гибридный подход:

  1. Переключитесь OpenId
  2. Если ваше приложение уже знает USERID, вы сделали
  3. Если не спрашивать у пользователя, если он имеет приходится мигрировать
  4. Если да, то войти в него со старым mechansim и ttransfer в АСоип
  5. Если не создать новую учетную запись
Смежные вопросы