|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Помогите разобраться, как правильно использовать сессии. У меня есть трехсторонняя система: Пользователь - Сайт - Сервис. Пользователь авторизуется на Сайте, после успешной авторизации у Сайта есть его учетное имя (username). Часть данных Сайт получает с Сервиса, при этом состав данных зависит от Пользователя. Сайт передает на Сервис учетное имя пользователя, получает токен и использует этот токен в последующих запросах. Токен действует несколько часов. Как можно "закешировать" токен на срок его действия, чтобы не запрашивать каждый раз? Я в общих чертах представляю себе это так: Код: php 1. 2. 3. 4. 5. 6. 7.
Все верно? Или сессии и так будут уникальны для каждого посетителя и можно использовать сразу $_SESSION['token'] ? Или все делается по другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 09:24 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Тут много зависимостей, которые не раскрыты. Механизм сессий может быть очень сильно разным. Начиная от простейшего штатного, где сессия прекращается через 1440 секунд бездействия (заметьте, это много менее нескольких часов действия токена) и до навороченного с "вечным" хранением пользовательских данных в БД. В последнем случае токен, привязанный к юзернейму вполне можно хранить в пользовательской сессии. Если же использован простой механизм сессий, а токен привязан к юзернейму, то и хранить его где-то в таблице свойств юзера есть смысл. Впрочем, несложно заметить, что и первый и второй вариант по сути хранят токен в базе. Ну и вариант, когда токен выдается Сайту... Понятно, надеюсь, что хранить такой токен есть смысл на уровне свойств/настроек сайта. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 10:30 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Нет, у меня используется простой (встроенный в PHP) механизм сессий. То есть сессии — это глобальное (на уровне всего сайта) хранилище, а не свое для каждого посетителя? Мне откуда-то вспоминалось, что сессии каждого посетителя изолированы от чужих. Что касается того, кому принадлежит токен — то явно не Сайту, потому что Сервис по токену возвращает свои данные для каждого Пользователя. Но токен не совсем и Пользователя — если на Сайте будет несколько Пользователей, использовавших для авторизации одно и то же учетное имя, то на них всех будет один токен. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 12:06 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Alibek B. То есть сессии — это глобальное (на уровне всего сайта) хранилище, а не свое для каждого посетителя? Каждая сессия в простом варианте уникальна для посетителя и ее имя (и имя файла для хранения данных) явно привязано к куке, которую получает/присылает пользователь. Alibek B. если на Сайте будет несколько Пользователей, использовавших для авторизации одно и то же учетное имя, то на них всех будет один токен. Или вот еще хороший вариант - можно мемкеш задействовать для хранения. Запоминать в нем пару варнейм=>токен (где варнейм содержит учетное имя пользователя) на время равное или чуть менее времени годности токена. Притом, логика простая получается. Если мемкеш вернул данные - использовать их, если не вернул - запрашивать токен, сохранять его и использовать в текущем обращении. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 12:32 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
vkle Где-то на сайте есть таблица пользователей с их учетными именами? Не совсем. На Сайте используется HTTPS и клиентские сертификаты. Проверка сертификата (кем и для кого выпущен) осуществляется на уровне самого веб-сервера. А те сертификаты, что прошли проверку, попадают на Сайт и Сайт использует прописанный в них логин (учетное имя Пользователя). Но дополнительно этот логин проверяется на Сервисе — сертификат должен быть валидный, но кроме того сертификат должен быть разрешен к использованию. Сервис сообщает Сайту результат проверки сертификата, а также уровень доступа Пользователя данного сертификата. Вот чтобы упростить эту проверку, я и хочу сделать ее один раз, сопоставить с токеном и в дальнейшем использовать токен для проверки доступа. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 13:02 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Ух, как завернули! У сертификата, по идее, должен быть свой срок годности. А ещё его можно отозвать досрочно. И совсем не обязательно то и другое должно превышать срок годности токена. Другими словами, не получится ли так, что сертификат уже непригоден, а токен вполне себе живой. Наверно, этот момент тоже как-то следует учесть. С плановым окончанием срока годности вполне понятно. Но как учесть досрочный отзыв сертификата без дополнительного обращения к Сервису? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 13:26 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
vkle Другими словами, не получится ли так, что сертификат уже непригоден, а токен вполне себе живой. Нет, не получится. Если сертификат просрочен или отозван, то он даже до PHP не дойдет, его веб-сервер отклонит. Отзыв сертификата — это добавление его в CRL на веб-сервере, вполне штатная задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 13:47 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Тогда для чего эту проверку замутили? Alibek B. Сайт использует прописанный в них логин (учетное имя Пользователя). Но дополнительно этот логин проверяется на Сервисе — сертификат должен быть валидный, но кроме того сертификат должен быть разрешен к использованию. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 13:58 |
|
PHP: Вопрос по сессиям
|
|||
---|---|---|---|
#18+
Во-первых, доступ пользователя может быть отключен или приостановлен (при том, что сертификат не отзывается). Во-вторых, на сертификате не прописаны уровни доступа, там только аутентификация, но не авторизация. Уровни доступа определяются при проверке, но их можно считать неизменными и проверять/узнавать только однажды. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2020, 14:16 |
|
|
start [/forum/topic.php?fid=23&msg=39928836&tid=1459757]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 158ms |
0 / 0 |