
Sergey
31.03.2018
12:02:17
думай дальше)
это можно все сделать на одной табличке если ты придумаешь одну модель данных)
p.s. подсказка - у тебя есть jsonb и прочие штуки

Вадим
31.03.2018
12:03:49
ну у меня мускуль )

Google

Sergey
31.03.2018
12:03:58
mysql 5.7 умеет в json
или ты еще на 5.6 сидишь?

Вадим
31.03.2018
12:04:21
Ну да в 2-м кейсе, историю можно хранить в виде сериализированого массива

Sergey
31.03.2018
12:04:53
в mysql 5.6 у тебя там будет просто TEXT

Вадим
31.03.2018
12:05:28
Угу. Но в 1 юскейсе так не получится )
Либо хардкодом в энтитю забить ))))

Sergey
31.03.2018
12:06:15
да, тут нужно либо имплементацию сущности подменять либо думать как можно вынести проверку пароля во вне
ну я просто тебе накидываю) что бы не так скучно было)

Вадим
31.03.2018
12:07:57
Да у меня тут и так накинуто, не могу придумать ) Как мне сделать так что б пароли хешировались, а токены нет, и что б в одной табличке )

Sergey
31.03.2018
12:08:20
ну вывод - разделить модель поведения и модель данных)
(но не сервисы менеджеры)

Google

Sergey
31.03.2018
12:08:43
а еще - возможно в этом бандле не юзать ORM)

Вадим
31.03.2018
12:09:05
Я хотел скрестить ежа с ужом ) и окрамиуса и твою идею ) А оно не идет )
хм ... вариант с password_needs_rehash в конструкторе решило бы проблему, но тогда энкодер будет зашит в сущность. И тогда теряется гибкость )

Sergey
31.03.2018
12:14:00
эт как?
короч я бы тебе рекомендовал на самом деле пойти сверху вних, то есть начать с того что бы продумать как твоим бандлом будут пользоваться
а что внутри - не столь важно уже
но как по мне - все взаимодействие с твоей либкой должно идти строго через какие-то сервисы, и к сущностям не надо подпускать

Вадим
31.03.2018
12:15:07
Ну типа public function __construct(string $identity,string $secret, $type, $isSecured=true)
isSecured укажед нужно ли хешировать

Sergey
31.03.2018
12:15:17
можно давать возможность предоставлять свои реализации "сущностей" но тогда надо что бы не конфликтовало с другими фичами

Вадим
31.03.2018
12:15:33

Sergey
31.03.2018
12:15:47
просто взять код из живого проекта не особо выйдет
все будет просто прибито гвоздями

Вадим
31.03.2018
12:16:17

Sergey
31.03.2018
12:16:20
а что бы "гибко" - живому проекту это не надо)

Google

Sergey
31.03.2018
12:16:46
а потом уже сделать выводы и запилить с нуля но реюзабельно
а так ты только время потратишь и гибкости не получится

Вадим
31.03.2018
12:17:35
Ну я хоть основу сделаю, что б правильно было, а в след раз или перепишу или допилю )
Я весь код стараюсь писать так что б не было гвоздей ) Даже раньше когда писал проджект в разных бандлах, а потом один бандл тупо с адаптерами, который связывал бандлы между собой.
Идею увидел у symfony-*-bridge

Alan
31.03.2018
13:23:09
а зачем хранить токены?
это те которые ты выдаёшь в обмен на успешную oauth2?


Valentin
31.03.2018
13:26:43
Привет, сейчас делаю аутентификацию и регистрацию через апи на симфони 4, кому не жалко пары минут - посмотрите код пожалуйста,
скажите что я сделал не так и что стоит переделать что бы я себе не выстрелил в колено.
Сейчас у меня есть 2 аутентификатора: PasswordAuthenticator - его задача найти юзера по логину и паролю, выдать в ответ токен который клиент должен будет передавать через (/api/users?apiKey=...), этот аутентификатор работает только по пути /api/login.
Второй же TokenAuthenticator - на его плечах найти юзера по токену и авторизировать его, если никого не нашли - ничего страшного, запрос идёт дальше, возможно для этого роута не требуется авторизации, этот аутентификатор работает по всех роутах с префиксом /api
А теперь вопросы которые меня беспокоят - кто должен отвечать за генерацию токена?
Нормально ли делать так: https://github.com/svbackend/my-art-lib/blob/master/src/Security/PasswordAuthenticator.php#L72 ? Интересует мнение не только по этой строке но и по всему методу
Второй момент это инвалидация токенов, как лучше всего это организовать и где? Пока что пришёл к этому - надо вынести токены в отдельную таблицу куда добавить поле expires_at, TokenAuthenticator будет загружать токен только когда expires_at >= NOW() если же токен нашёлся но просрочился - требуем юзера авторизироваться заново, но не нравится момент что в этом случае в юзера "сессия" будет слетать каждые там 2 недели условно (в зависимости от настроен токена), как можно этого избежать? Выдавать токены на год?
Пока на этом всё, буду благодарен за любые ответы


Вадим
31.03.2018
13:28:39


Pavel
31.03.2018
13:39:35
Привет, сейчас делаю аутентификацию и регистрацию через апи на симфони 4, кому не жалко пары минут - посмотрите код пожалуйста,
скажите что я сделал не так и что стоит переделать что бы я себе не выстрелил в колено.
Сейчас у меня есть 2 аутентификатора: PasswordAuthenticator - его задача найти юзера по логину и паролю, выдать в ответ токен который клиент должен будет передавать через (/api/users?apiKey=...), этот аутентификатор работает только по пути /api/login.
Второй же TokenAuthenticator - на его плечах найти юзера по токену и авторизировать его, если никого не нашли - ничего страшного, запрос идёт дальше, возможно для этого роута не требуется авторизации, этот аутентификатор работает по всех роутах с префиксом /api
А теперь вопросы которые меня беспокоят - кто должен отвечать за генерацию токена?
Нормально ли делать так: https://github.com/svbackend/my-art-lib/blob/master/src/Security/PasswordAuthenticator.php#L72 ? Интересует мнение не только по этой строке но и по всему методу
Второй момент это инвалидация токенов, как лучше всего это организовать и где? Пока что пришёл к этому - надо вынести токены в отдельную таблицу куда добавить поле expires_at, TokenAuthenticator будет загружать токен только когда expires_at >= NOW() если же токен нашёлся но просрочился - требуем юзера авторизироваться заново, но не нравится момент что в этом случае в юзера "сессия" будет слетать каждые там 2 недели условно (в зависимости от настроен токена), как можно этого избежать? Выдавать токены на год?
Пока на этом всё, буду благодарен за любые ответы
Зачем тебе сессия в api?


Valentin
31.03.2018
13:44:43
Зачем тебе сессия в api?
Специально же в кавычки взял, это не сессия, как может быть сессия в апи если оно у нас стейтлесс, это я имел ввиду авторизация будет слетать каждый раз когда токен становится експайред

Pavel
31.03.2018
13:45:51

Valentin
31.03.2018
13:48:34
Тоже думаю об этом, нет в этом каких то подводных камней? Вроде всё прозрачно, но всё же решил тут спросить, по сути да, я могу удалять токен когда юзер вышел (логаут) или когда его забанили допустим

Pavel
31.03.2018
13:49:06
то им нельзя было долго пользоваться

Valentin
31.03.2018
13:50:44
Ну в этом случае токен надо выдавать максимум на пару минут, потому что иначе его можно спиздить и даже за час уже наломать дров

Pavel
31.03.2018
13:50:48
челик вводит логин пароль
даешь ему токен на полчаса
если ему приходит ошибка аутинфикации( токен устарел например)

Google

Pavel
31.03.2018
13:52:02
он шлет его еще раз

Valentin
31.03.2018
13:52:32

Pavel
31.03.2018
13:52:45

Valentin
31.03.2018
13:53:17
Вот я не хочу что бы юзер вводил логин и пароль каждые пол часа

Pavel
31.03.2018
13:53:32
интересный метод

Valentin
31.03.2018
13:54:44

Pavel
31.03.2018
13:55:17

Admin
ERROR: S client not available

Pavel
31.03.2018
13:55:24
Себя надо защищать
а не юзера

Valentin
31.03.2018
13:55:27
Я же не ввожу в телеграме допустим свой пароль каждый час

Pavel
31.03.2018
13:55:56

Valentin
31.03.2018
13:58:01

Pavel
31.03.2018
13:59:57

Valentin
31.03.2018
14:17:00

Pavel
31.03.2018
14:17:20
Да никак ты юзеров не защитишь

Valentin
31.03.2018
14:23:15
Почему то я тебе не верю)

Google

Вадим
31.03.2018
14:26:52
Либо вводить refresh token как в oauth

Alan
31.03.2018
14:48:12
https + если в локалсторадже хранишь то защищаться от xss, если в куках то от csrf/xsrf аттак, и кнопочка выйти на всех устройствах

Danil
31.03.2018
17:02:36
Вообще перед тем, как всё делать, стоило почитать про oauth

Vladislav
31.03.2018
17:03:53
oauth и jwt исполюзуются для разных задач

Danil
31.03.2018
17:04:25
И посмотреть вот сюда https://github.com/thephpleague/oauth2-server

Sergey
31.03.2018
17:05:50

Danil
31.03.2018
17:06:27
Да я про jwt вообще молчал)

Vladislav
31.03.2018
17:06:50
а зачем oauth ему?

Sergey
31.03.2018
17:07:18
а зачем oauth ему?
вот я никогда не понимал людей которые рекомендую oauth там где нет "третьей стороны"
клево конечно когда ты можешь замутить отдельный auth сервер
но зачем... для простого проекта - oauth....

Danil
31.03.2018
17:08:06
Видимо потому что хочет) вопрос-то не «что выбрать»

Sergey
31.03.2018
17:08:22

Danil
31.03.2018
17:08:32
Автор вопроса

Sergey
31.03.2018
17:08:52
автор вопроса хочет аутентификацию для апишки, где-то увидел про oauth, где-то про jwt
не первый день он с этим вопросом

Danil
31.03.2018
17:09:19
В итоге пилит все вместе

Konstantin
31.03.2018
17:09:32
а че сразу бандла готового нет? )))

Sergey
31.03.2018
17:09:43
вроде.... ни разу не приходилось юзать

Danil
31.03.2018
17:10:40
Вроде на основе phpleague и сделали бандл

Valentin
31.03.2018
17:10:50
Пилю сам потому что проект для обучения, знаю что есть бандлы готовые, хочу без них и при этом что бы по безопасности не было проблем