@codenamecrud

Страница 496 из 1009
Vitaliy
12.02.2017
16:29:41
knock в качестве прослойки

Ivan
12.02.2017
16:31:24
С devise?

Vitaliy
12.02.2017
16:31:33
нет, без всего

так как не требуется

Google
Vitaliy
12.02.2017
16:32:00
у нас проект - это rails-api для мобильных приложений, и веб-версия (фулл-стек на рельсах). API работает на JWT-токенах через knock.

В веб-версию я пока ничего не внедрял, но если внедрять JWT - все равно нужно озаботиться о хранении токенов на клиенте, в тех же куках

Ivan
12.02.2017
16:33:57
В веб-версию я пока ничего не внедрял, но если внедрять JWT - все равно нужно озаботиться о хранении токенов на клиенте, в тех же куках
Это уже джаваскриптеры пусть заботятся. Но тем не менее почему без devise'a? Просто не нужно заморачиваться с кодированием паролей и т.д.

Vitaliy
12.02.2017
16:34:13
потому что он не требуется

и джаваскриптеры не должны об этом заботиться - это задача фул-стек разработчика или лида - позаботиться о безопасности

Ivan
12.02.2017
16:35:31
Окей :) Джаваскриптеры в смысле фронтендеры. Им делать стейтлесс запросы к апи и вставлять токен в них, и обновлять его.

Vitaliy
12.02.2017
16:35:45
В веб-версию я пока ничего не внедрял, но если внедрять JWT - все равно нужно озаботиться о хранении токенов на клиенте, в тех же куках
Это я к тому написал - что просто так внедрить JWT в фул-стек рельсу и думать, что все хорошо - недостаточно

Vitaliy
12.02.2017
16:36:54
опасненько конечно

Ivan
12.02.2017
16:37:10
Vitaliy
12.02.2017
16:37:36
На бекенде хватит JWT и Knock, но на клиенте нужно токены хранить в недоступном злоумышленникам месте

В мобильных приложениях это не проблема, т.к. мобильные приложения закрыты для дебаггинга простым пользователям

Google
Vitaliy
12.02.2017
16:38:50
а в связке бек + фронт - фронт уязвим, можно палить чужие токены и использовать их

и это нехорошо

Мне еще самому предстоит с этим разобраться, изучить вопрос с CSRF, например.

Как, например, обеспечивается защита от CSRF в связке фронт+бэк

Сам по себе JWT-токен в простейшем случае - это просто зашифрованный айдишник пользователя

Зашифрованный, но не подписанный

Ivan
12.02.2017
16:46:12
Cookies, when used with the HttpOnly cookie flag, are not accessible through JavaScript, and are immune to XSS. You can also set the Secure cookie flag to guarantee the cookie is only sent over HTTPS. This is one of the main reasons that cookies have been leveraged in the past to store tokens or session data. Modern developers are hesitant to use cookies because they traditionally required state to be stored on the server, thus breaking RESTful best practices. Cookies as a storage mechanism do not require state to be stored on the server if you are storing a JWT in the cookie. This is because the JWT encapsulates everything the server needs to serve the request.

Conclusion JWTs are an awesome authentication mechanism. They give you a structured way to declare users and what they can access. They can be encrypted and signed for to prevent tampering on the client side, but the devil is in the details and where you store them. Stormpath recommends that you store your JWT in cookies for web applications, because of the additional security they provide, and the simplicity of protecting against CSRF with modern web frameworks. HTML5 Web Storage is vulnerable to XSS, has a larger attack surface area, and can impact all application users on a successful attack.

https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage Вот эта статья. Довольно интересно.

Про CSRF согласен. Расслабляешься, когда рельсы делают всё за тебя

Vitaliy
12.02.2017
16:48:59
супер, за статью спасибо, возможно по ней закрою пробелы

Ivan
12.02.2017
16:50:27
Vitaliy
12.02.2017
16:51:07
http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html

Это добавляет в User 3 метода: password= password_confirmation= authenticate

в которых завязана вся логика по кодированию пароля (bcrypt)

Ivan
12.02.2017
16:52:47
Кодирование пароля, кстати - у меня решается добавлением has_secure_password в модели User.
А конфирматион мыла и восстановление пароля просто через SecureRandom base64 и последующее сравнение?

Vitaliy
12.02.2017
16:53:46
Вот над этим как раз мне предстоит подумать. Внедрять монструозный девайс просто ради восстановления пароля, либо обойтись clearance/sorcery, либо написать скромный велосипедик

Google
Vitaliy
12.02.2017
16:54:51
Пока в сторону clearance склоняюсь - очень грамотный гем, на код смотреть приятно, и кастомизировать тоже, по всем канонам ООП

В исходники девайса лезть боюсь, каюсь

Vitaliy
12.02.2017
16:56:36
А конфирматион мыла и восстановление пароля просто через SecureRandom base64 и последующее сравнение?
Как вариант, кстати - можно генерить тот же JWT-токен с сроком действия в условный час - вот и готова ссылка для восстановления пароля

Ivan
12.02.2017
16:58:12
Как вариант, кстати - можно генерить тот же JWT-токен с сроком действия в условный час - вот и готова ссылка для восстановления пароля
Да мне кажется не суть, какой токен генерировать, главное что-бы истекал. Нам же его всего один раз нужно использовать.

Хоть base64, хоть hex

Как вариант, кстати - можно генерить тот же JWT-токен с сроком действия в условный час - вот и готова ссылка для восстановления пароля
# Generate a friendly string randomly to be used as token. # By default, length is 20 characters. def self.friendly_token(length = 20) # To calculate real characters, we must perform this operation. # See SecureRandom.urlsafe_base64 rlength = (length * 3) / 4 SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz') end # constant-time comparison algorithm to prevent timing attacks def self.secure_compare(a, b) return false if a.blank? || b.blank? || a.bytesize != b.bytesize l = a.unpack "C#{a.bytesize}" res = 0 b.each_byte { |byte| res |= byte ^ l.shift } res == 0 end end

Это из девайса

И эти методы используются при генерации всевозможных токенов для восстановления пароля / конфирмации мыла. Ну, естественно обернутые в штуки взаимодействующие с базой

Vitaliy
12.02.2017
17:16:19
thanks, схоронил

Eugene
12.02.2017
18:09:40
Что такое jwt

Ivan
12.02.2017
18:12:06
Что такое jwt
JSON web token. Красиво и кратко: https://jwt.io/introduction/ Скучно RFC 7519: https://tools.ietf.org/html/rfc7519 TL;DR Отдаем токен в хедерах запроса к серверу, когда токен истекает его можно использовать один раз что-бы получить новый. Всё как обычно. Различные приемущества, в которых мне разбираться лень тоже присутствуют, типа дополнительная сесурити, быстрота и ещё что-то.

Eugene
12.02.2017
18:21:12
Amman okay

Vasiliy
13.02.2017
07:16:23
jwt жи для хранения шифрованной инфы в токене

Ivan
13.02.2017
08:08:09
jwt жи для хранения шифрованной инфы в токене
В том числе. Но я бы сказал просто 'хранения инфы', так как декодить jwt может любой

Как я понял.

Vasiliy
13.02.2017
08:08:43
декодить ж ток с секретным ключом

Ivan
13.02.2017
08:09:23
декодить ж ток с секретным ключом
Только вот секретный ключ уже есть в токене после последней точки.

А нет, все еще проще http://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript

Vasiliy
13.02.2017
08:15:07
так это же вроде если ты секрет знаешь

Google
Vasiliy
13.02.2017
08:16:19
а так можешь на серваке шифровать -> возращать юзеру -> хранить у него -> получать от него -> расшифровывать

эт конечно всё теория, я толком в jwt въехать не могу(чем это лучше обычного uid в сессии).

Vitaliy
13.02.2017
08:21:03
верно, так и происходит

рельса шифрует payload своим каким-нибудь rake secret ключом

клиент о ключе не знает

Vasiliy
13.02.2017
08:26:40
но чем лучше то чем uid сессии? ? по сути корзину там или чет такое особо не пошаришь м/у устройствами, бравзерами. Мне вот советовали что очень ок отдавать в jwt всю инфу сразу аля роль+инфо+данные из других каких-то моделей шоб запросы к бд не делать

но как-т хз, сессию мы всё равно ж храним или я путаю теплое с мягким

Vitaliy
13.02.2017
08:34:04
верно, jwt это способ в зашифрованном виде передать сразу все нужное. Но зашифрованный - не значит подписанный, поэтому в веб среде нужно такой токен все равно хранить в куках тех же

Vitaliy
13.02.2017
08:37:39
да, в API для мобильных приложений

Admin
ERROR: S client not available

Vasiliy
13.02.2017
08:38:18
секрет получается шарится м/у сервером и моб клиентом, верно?

Vitaliy
13.02.2017
08:39:13
токен шарится, да, и так как в моб. клиенте среда закрытая, не нужно ничего думать с сессией и куками

секрет получается шарится м/у сервером и моб клиентом, верно?
а секрет, которым шифруются данные в токен - всегда остается только на сервере

Vasiliy
13.02.2017
08:41:00
ааа, всё, догнал - запросы потом с токеном идут(я чет думал что ты всю инфу в jwt шлёшь)

Vitaliy
13.02.2017
08:41:07
т.е. клиент токен расшифровать не может - он может его только крепить к запросам, а сервер запросы примет, расшифрует и узнает, что это за пользователь там, и стоит ли его авторизовывать

Vasiliy
13.02.2017
08:43:38
ну так же можно просто секурную строку-токен(хранимую в бд) использовать и дальше уже искать пользователя по строке этой и погнали

Vitaliy
13.02.2017
08:48:39
Можно. Если payload состоит только из id пользователя - на то оно и выйдет

Jwt это некий стандартизированный метод шифровки произвольных данных, не более того

Vasiliy
13.02.2017
08:58:27
а если к примеру тебе надо токен скинуть(аля выход из всех устройств)?

Google
Vitaliy
13.02.2017
09:05:06
Можно так: - На сервере в БД храним у пользователя поле "крайняя дата выпуска токена" - Это же поле храним в payload токена - При запросах с токеном - сервер расшифрует его, глянет в payload[:date] и авторизует только те токены, которые были выпущены после крайней даты выпуска токена для данного пользователя - "Выход на всех устройствах" - это запрос, который обновит дату выпуска токена для текущего пользователя на сервере. Таким образом все токены, выпущенные ранее, станут недействительны

Vasiliy
13.02.2017
09:24:33
?

Valentun
13.02.2017
09:54:16
Ребят, можно ли релазовать двойную связь моделей? То есть, игра будет иметь юзера (создатель), а также много других юзеров (участники)?

I
13.02.2017
09:54:30
да

Valentun
13.02.2017
09:55:48
Через полиморфные?

I
13.02.2017
09:56:02
нет, зачем залезать в это?)

Valentun
13.02.2017
09:56:25
Я просто недавно начал, не совсем понимаю)

I
13.02.2017
09:56:40
покажи ассоциации свои

Valentun
13.02.2017
09:57:38
Я ещё не начинал, просто в концерте модель игры должна иметь создателя и участников, в доках не нашёл

I
13.02.2017
09:58:46
class Game has_one :organizer, class_name: "User" has_many :participants, class_name: "User" end ну что-то такое я имею ввиду

Valentun
13.02.2017
09:59:41
Ясно, сейчас попробую. Спасибо)

Ivan
13.02.2017
10:11:33
@gambala А как ты реализовывал рефреш тухлого токена? Что-то типа такого на сервере?

https://puu.sh/u16DW/fffea5181b.png

Vitaliy
13.02.2017
10:12:46
В payload токена помещается дата истечения токена. Это, кстати, knock делает из коробки.

Потом сервер расшифровывает токен, смотрит в payload[:expiration_date], и если она истекла - редиректит на логин

Ivan
13.02.2017
10:13:41
В payload токена помещается дата истечения токена. Это, кстати, knock делает из коробки.
Ну, таки а после истечения? Заставлять юзера вводить логин/пароль?

И если долгоиграющий токен != хорошо, то вводить логин пароль юзеру каждые Х дней - это такое себе.

Vitaliy
13.02.2017
10:15:40
нормальная практика

но опять же - никто не мешает выставить дату истечения токена на пять лет

Ivan
13.02.2017
10:16:27
Просто никакой сервис, коими я пользуюсь на телефоне, например (ну или в вебе, на телефоне лучше пример - потому что там всегда апи и всегда токен), не просит вводить пароль больше одного раза. Если только ты не сбросил данные

Значит либо там перманент токен, либо он рефрешится

Страница 496 из 1009