Знайомство з n2o v4.4 [7]
Подружимо n2o та cowboy rest -
отримання сесії n2o в cowboy rest page module
розглянемо на прикладі коду цього блогу -
(upd. блог переїхав на mdbook, а код залишився - пригодиться)
у нас є два роутери - роутер n2o https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/routes.erl
та роутер cowboy https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/ublog.erl
як ви могли здогадатись, на сторінках першого - з коробки працюють сесії,
на сторінках другого- ні
спробуємо отримати сесію користувача в cowboy rest page module
по-замовчуванню кука сесії в n2o має імя site-sid, вона нам і потрібна
крім того, сесії в n2o зберігаються в ets таблиці та дозволяють зберігати key-value структури
при логіні в n2o ми записує в сесію значення uid користувача під ключем uid
https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/login.erl#L35
це значення ми зараз і дістанемо
напишемо функцію, котра дістає з сесії значення по ключу, за наявності сесії, звязаної з кукою
get_session_value(Key,Req) ->
SessionCookie = n2o_cowboy:cookie(<<"site-sid">>, Req),
?MODULE:get_session_value2(n2o_session:lookup_ets({SessionCookie, Key})).
%helper
get_session_value2({_, _, _, _, A}) -> A;
get_session_value2(_) -> undefined.
ця функція в коді цього блогу -
https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/hm.erl#L138
виклик цієї функції в коді цього блогу -
https://github.com/221V/ublog/blob/c998dd07ff5c1153de8fe3b5ec064adb34cf8fdb/apps/ublog/src/main_rest.erl#L64
результати роботи цієї функції -
hm:get_session_value(<<"auth">>,Req), % new|undefined % logged|not logged
hm:get_session_value(<<"user">>,Req), % <<"binary">>|undefined
hm:get_session_value(uid,Req), % integer|<<"binary">>|undefined % integer or binary if we put there integer or binary
пояснення -
виклик з ключем <<"auth">> - ми перевіряємо чи існує сесія
виклик з ключем <<"user">> - отримати імя користувача сесії
виклик з ключем uid - отримати збережене значення по заданому нами раніше ключу uid