2009-04-22 5 views
9

Я работаю над приложением, которое позволяет зарегистрированным пользователям создавать или загружать контент и позволяет анонимным пользователям просматривать этот контент и просматривать страницы зарегистрированных пользователей, чтобы найти этот контент - это очень похоже на то, как сайт, например, Flickr, позволяет пользователям просматривать страницы своих пользователей.Создание уникальных и непрозрачных идентификаторов пользователей в Google App Engine

Для этого мне нужен способ идентифицировать пользователя в анонимном запросе HTTP GET. Пользователь должен иметь возможность ввести http://myapplication.com/browse/<userid>/<contentid> и перейти на нужную страницу - должен быть уникальным, но не должен быть чем-то вроде адреса электронной почты пользователя, в целях конфиденциальности.

Через Google App Engine я могу получить адрес электронной почты, связанный с пользователем, но, как я уже сказал, я не хочу его использовать. Я могу, чтобы пользователи моего приложения выбирали уникальное имя пользователя при регистрации, но я хотел бы сделать это необязательным, если это вообще возможно, чтобы процесс регистрации был как можно короче.

Еще один вариант - генерировать некоторые случайные файлы cookie (GUID?) Во время процесса регистрации и использовать это, я не вижу очевидного способа гарантировать уникальность такого файла cookie без поездки в базу данных.

Есть ли способ, предоставляемый объекту пользователя App Engine, получить уникальный идентификатор для этого объекта, который может быть использован таким образом?

Я ищу решение Python - я забыл, что GAE также поддерживает Java. Тем не менее, я ожидаю, что методы будут похожи, независимо от языка.

ответ

7

Ваше время безупречно: только вчера вышел новый выпуск SDK с поддержкой unique, permanent user IDs. Они соответствуют всем указанным вами критериям.

+0

«Если текущий пользователь не подписан, конструктор Users вызывает UserNotFoundError». - т. е. для этого требуется вход в Google. Однако я бы сказал, что использование механизма входа в систему Google лучше, чем сворачивать ваши собственные, особенно для ожиданий пользователей. – Mark

+1

Однако мне приходит в голову, что user_id может быть уникальным в мире, что было бы нехорошо. – Mark

+0

Похоже, это именно то, что я ищу, на самом деле. Я использую вход в систему Google, и действительно уникальным для пользователя user_id является требование. Отлично. –

1

Возможно, вы имели в виду session cookies?

Попробуйте http://code.google.com/p/gaeutilities/


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

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

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

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

+0

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

+0

Мое предложение состоит в том, чтобы использовать gaeutilities для незарегистрированного пользователя. – Mark

+0

не вошедшие в систему пользователи взаимодействуют с приложением полностью без гражданства, поэтому это не применимо. Спасибо за указатель, хотя - это похоже на удобную библиотеку. –

3

Я думаю, вы должны различать два типа пользователей:

1) пользователи, которые вошли в систему с помощью учетных записей Google или которые уже зарегистрированы на сайте с не-Google электронной почты

2) пользователи, которые впервые открыли ваш сайт и никоим образом не вошли в систему

Для второго случая я не вижу другого способа, кроме как создать случайную строку (например, через uuid.uuid4() или из этого файла cookie этого пользователя ключ), поскольку анонимный пользователь не несет с собой никакой уникальной информации.

Для пользователей, которые вошли в систему, у вас уже есть уникальный идентификатор - их адрес электронной почты. Я согласен с вашими проблемами конфиденциальности - вы не должны использовать его как идентификатор. Вместо этого, как насчет генерации строки, которая кажется случайной, но на самом деле сгенерирована с адреса электронной почты? Хеширующие функции идеально подходят для этой цели. Пример:

>>> import hashlib 

>>> email = '[email protected]' 
>>> salt = 'SomeLongStringThatWillBeAppendedToEachEmail' 

>>> key = hashlib.sha1('%s$%s' % (email, salt)).hexdigest() 
>>> print key 
f6cd3459f9a39c97635c652884b3e328f05be0f7 

Как hashlib.sha1 не является случайной функцией, но для данных возвращает данные всегда тот же результат, но она оказалась практически необратим, то можно смело представить хэшированного ключ на веб-сайте без ущерба для пользователя е -Почта Адрес. Кроме того, вы можете смело предположить, что никакие два хэша отдельных электронных писем не будут одинаковыми (они могут быть, но вероятность того, что это произойдет, очень, очень мало). Для получения дополнительной информации о хэш-функции см. the Wikipedia entry.

+0

Я рассмотрел хэширование, и он не будет покупать меня много из-за возможности коллизий (очень маловероятно, но надежная программа должна его проверять). Мне все же нужна обратная связь с базой данных, после чего я мог бы просто генерировать случайный идентификатор и проверить это. Именно этого я и старался избегать. Что касается не прошедших проверку подлинности пользователей, они не могут создавать контент, поэтому это не проблема. –

Смежные вопросы