marazmiki / django-ulogin Goto Github PK
View Code? Open in Web Editor NEWPlug a social authentication feature to your Django application easy!
Home Page: https://django-ulogin.readthedocs.io/ru/latest/
License: MIT License
Plug a social authentication feature to your Django application easy!
Home Page: https://django-ulogin.readthedocs.io/ru/latest/
License: MIT License
Сейчас пользователь у меня хранится в ТРЁХ таблицах: родная auth_user
, django_ulogin_uloginuser
и myproject_user_info
из примера customize/models.py
Django умеет переопределять модель пользователя и теоретически я могу слить вместе auth_user
и myproject_user_info
полностью сам, но как мне заставить django_ulogin
писать в неё же свои данные ?
Цель - иметь доступ ко всей информации о пользователе в одной модели, которая автоматически берётся из базы и подставляется в разные места, в том числе в контексты шаблонов. Избегнуть необходимости делать три запроса к БД или JOIN на каждый веб-запрос.
P.S. Пишу в Issues а не в личное письмо, т.к. ответ будет полезен в общей документации.
Добавить параметр LANG в контекст шаблона (см. http://twitter.com/uLoginTeam/status/256054389087809536)
When using PostgreSQL as database backend, authorization fails because maximum username max_length is set to 30 characters in User model, and uuid4() length is 32.
На данный момент не запускаются функции каллбэк.
ULOGIN_CREATE_USER_CALLBACK = "oauth.authorization.my_user_create"
ULOGIN_LOGIN_CALLBACK = "oauth.authorization.my_user_create"`
Также с сигналами в мембер модель.
def catch_ulogin_signal(*args, **kwargs):
user = kwargs['user']
json = kwargs['ulogin_data']
ulogin = kwargs['ulogin_user']
logger.info('ulogin============= %s', ulogin)
logger.info('user============= %s', user)
logger.info('json============= %s', json)
if kwargs['registered']:
user.first_name = json['first_name']
user.last_name = json['last_name']
user.email = json['email']
user.password = f'321_{profile["username"]}_123'
user.save()
assign.connect(catch_ulogin_signal, sender=ULoginUser, dispatch_uid='member.models')
django==2.2.3
Python 3.6.8
Логи пустые. public.django_ulogin_uloginuser
тоже пустой, но сервис Ulogin авторизирует и работает.
Есть идея у кого нибудь ?
Подумать, как можно создать инстанс модели пользователя, про которую мы не знаем ничего: ни имени полей, ни их назначения.
Таблица django_ulogin_uloginuser
ссылается на auth_user
, но создаётся ранее неё.
stderr.txt
:
Traceback (most recent call last):
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/backends/utils.py", line 62, in execute
return self.cursor.execute(sql)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 124, in execute
return self.cursor.execute(query, args)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 226, in execute
self.errorhandler(self, exc, value)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorvalue
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 217, in execute
res = self._query(query)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 378, in _query
rowcount = self._do_query(q)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 341, in _do_query
db.query(q)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
_mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1005, "Can't create table 'my_cool_project.#sql-bb5_6' (errno: 150)")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
File "/opt/my_cool_project/lib/python3.4/site-packages/django/core/management/__init__.py", line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/core/management/base.py", line 394, in run_from_argv
self.execute(*args, **cmd_options)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/core/management/base.py", line 445, in execute
output = self.handle(*args, **options)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 179, in handle
created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 318, in sync_apps
cursor.execute(statement)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/utils.py", line 98, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
raise value.with_traceback(tb)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/backends/utils.py", line 62, in execute
return self.cursor.execute(sql)
File "/opt/my_cool_project/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 124, in execute
return self.cursor.execute(query, args)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 226, in execute
self.errorhandler(self, exc, value)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorvalue
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 217, in execute
res = self._query(query)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 378, in _query
rowcount = self._do_query(q)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/cursors.py", line 341, in _do_query
db.query(q)
File "/opt/my_cool_project/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
_mysql.connection.query(self, query)
django.db.utils.OperationalError: (1005, "Can't create table 'my_cool_project.#sql-bb5_6' (errno: 150)")
Журнал SQL запросов:
SET NAMES utf8
set autocommit=1
SET SQL_AUTO_IS_NULL = 0
SHOW FULL TABLES
CREATE TABLE `django_migrations` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `app` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `applied` datetime NOT NULL)
SELECT engine FROM information_schema.tables WHERE table_name = 'django_migrations'
SELECT `django_migrations`.`app`, `django_migrations`.`name` FROM `django_migrations`
SHOW FULL TABLES
set autocommit=0
CREATE TABLE `django_ulogin_uloginuser` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `user_id` integer NOT NULL, `network` varchar(255) NOT NULL, `identity` varchar(255) NOT NULL, `uid` varchar(255) NOT NULL, `date_created` datetime NOT NULL, UNIQUE (`network`, `uid`))
SELECT engine FROM information_schema.tables WHERE table_name = 'django_ulogin_uloginuser'
ALTER TABLE `django_ulogin_uloginuser` ADD CONSTRAINT `django_ulogin_uloginuse_user_id_4ad90afc4bd72726_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
rollback
set autocommit=1
P.S. Инструкция по установке битая, надо добавить https://
, делать пулл-реквест в лом.
diff --git a/README.rst b/README.rst
index 2cce4be..644f578 100644
--- a/README.rst
+++ b/README.rst
@@ -66 +66 @@ Django-ulogin является приложением для социально
- $ pip install -e git+github.com/marazmiki/django-ulogin.git#egg=django-ulogin
+ $ pip install -e git+https://github.com/marazmiki/django-ulogin.git#egg=django-ulogin
Пользователи должны иметь возможность заходить на сайт под своей учётной записью, используя разных провайдеров
Прошу немного улучшить тестовый проект с целью продемонстрировать возможность привязывания (и удаления) нескольких аккаунтов разных провайдеров к 1 и тому же пользователю джанги
Т.е. в настоящее время тестовый проект позволяет протестировать следующее: я могу войти через VK, система создаст пользователя. Далее, я выйду и войду через Twitter, система создаст нового пользователя.
Как мне бы хотелось: я вошел через VK и, не выходя из VK, вошел через Twitter, система во втором случае не сделала отдельный аккаунт, а просто привязала твиттер к первому аккаунту. А у меня появилась бы возможность удалять связь моего аккаунта с соцсетью (например, если мне потребовалось сменить твиттер или я решил отказаться от его дальнейшего использования).
Прошу немного улучшить тестовый проект с целью продемонстрировать возможность обычной регистрации (пусть система сгенерирует и покажет форму регистрации на базе указанных обязательных и не обязательных полей). Некоторые пользователи принципиально не хотят связывать свои аккаунты на сайтах с аккаунтами соцсетей по соображениям безопасности и они предпочтут ввести username/email и пароль. В настоящее время логин UUID, необходимо или разрешить пользователям его менять или в это поле всем пользователям автоматически прописывать email. (Или, к примеру, ставить на поле email индекс, чтобы была проверка уникальности данных, хранимых в этом поле)
Если кто-то из пользователей наткнется на этот баг, знайте - в настоящее время данный плагин подходит
В доках не нашел такого, и пока не соображу. Например, залогинился я в свой аккаунт через vk, а позже залогинился в него же через Яндекс. И требуется узнать, откуда залогинен текущий пользователь. Как это правильно сделать имеющимися средствами? Или нужно допиливать?
Сервер настроен таким образом, что редиректит все http-запросы на соответствующие https.
Однако в виджет при этом подставляется redirect_uri=http://..., и postback происходит на http://.../?next=http://... Nginx, естественно, автоматом редиректит это на https и все ломается.
Пока не сообразил как это правильно починить. Что можно сделать?
Django 2.0.7
django-ulogin с github-а.
Использовать aware datetime в DateTimeField
Доброго времени суток!
Хорошо бы использовать бэкенд авторизации из настроек, который прописан в AUTHENTICATION_BACKENDS. Пришлось исправлять на свой в этом месте: https://github.com/marazmiki/django-ulogin/blob/master/django_ulogin/views.py#L93
При использование примера
def catch_ulogin_signal(*args, **kwargs):
user=kwargs['user']
json=kwargs['ulogin_data']
if kwargs['registered']:
user.last_name=json['last_name']
user.email=json['email']
kwargs['user'].save()
вываливается ошибка:
KeyError at /ulogin/postback/
'username'
Возможно это связано с отложенными вычислениями
mysql bug http://bugs.mysql.com/bug.php?id=4541
the reason is that ULoginUser model has an index with 768 bytes, but if a database encoding is utf8, this index has 2394 bytes, but mysql has a limit of 1000 bytes. Maybe it is possible to cut total length of this fields to 333 bytes.
На текущий момент ulogin анонсировал дополнительные поля:
И провайдеров:
Все сделал как в описании к пакету
FB Twitter работает
Вконтакте редиректит на URL
https://oauth.vk.com/error?err=2
Где ответом JSON
{"error":"invalid_request","error_description":"Security Error"}
When using standard "requires_login" wrapper on views, it redirects unauthenticated users to urls like '/login/?next=private', it would be wonderful if 'next' query parameter will not be ignored on login process via uLogin. This parameter should be passed to uLogin script and used as redirect url after logging in.
Изменить script src с поддержкой адреса относительно текущей схемы: "//ulogin.ru/..."
Тяжело точно сформулировать проблему, опишу на примере.
Возникает ошибка при повторной аутентификации пользователя, уже ранее зарегистрированного в системе.
Пример:
Проверено на всех поддерживаемых соц-сетях, после регистрации в базе данных поля 'email', 'first_name', 'last_name' пустуют.
Django 1.8.6
БД Postgresql
Версии Ulogin 0.2.3
Если на сайте используется кастомная модель пользователя (созданная через AbstractBaseUser), то при попытке запустить тест происходит ошибка создания тестовой базы данных. "django.db.utils.ProgrammingError: relation "site_user_siteuser" does not exist"
Я посмотрел, как Djnago создает тестовую базу данных.
Сделал все по гайду, спасибо. Понятно и удобно.
При переадресации на https://... джанга выдает ошибку "csrf token missing or incorrect". Подскажите, сталкивались ли с этим и как можно победить?
При переадресации на http://... ошибки нет.
Учитывая, что скрипт ulogin выполняется на внешнем ресурсе, вставить crrf токен я не могу
python 3.6.9
django 3.1.5
TypeError str returned non-string (type User)
I think this is because https://github.com/marazmiki/django-ulogin/blob/master/django_ulogin/models.py#L43 return non string value.
Django 3.0.4 and Python 3.8
Странная ситуация. Я разместил на сайте виджет. Если заходить Хромом, то любая успешная авторизация в провайдере приводит на страницу https://site.ru/ulogin/postback/?next=https://site.ru/ . Страница пустая. В логах появляется запись "django.request WARNING Method Not Allowed (GET): /ulogin/postback/". В Файерфоксе все ок. Версия пакета 0.2.3.
В настойках не поддерживается mobilebuttons
параметр. Хотелось бы отключить мобильную версию.
Может могу и сам это сделать если вкратции объясните как это делается.
Доброго времени суток!
Сделайте, пожалуйста, уникальную почту пользователя: если такая почта уже есть, то при регистрации пользователь с такой же почтой не регистрируется, а авторизуется как существующий.
PS: это самое адекватное джанго-приложение для авторизации через соц. сети
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.