Клиенты будут обращаться к серверу для получения JSON Web Token. Сервер будет проверять данные в PostgreSQL, если они будут совпадать, то выдается JWT.
Сервер будет на Node.JS (хоститься будет на Zeit Now, возможно на Lambda).
CREATE TABLE user (
login text PRIMARY KEY,
password_hash text NOT NULL,
roles text[] NOT NULL
);
CREATE TABLE fridge (
id integer PRIMARY KEY,
hardware_id text UNIQUE
);
{
"sub": "login@login.com",
"iat": 1516239022,
"https://hasura.io/jwt/claims": {
"x-hasura-allowed-roles": ["admin","user"],
"x-hasura-default-role": "admin"
}
}
Запрос токена от клиента будет приходить через обычный POST-запрос к REST API. Авторизация будет возможна двумя методами.
Запрос от клиента:
{
"login": "test@test.com",
"password": "123"
}
При авторизации по логину и паролю нужно найти в базе данных пользователя с заданным паролем и вернуть из таблицы user
. В базе данных пароль будет хранится в хешированном виде, метод хеширования на ваше усмотрение.
x-hasura-allowed-roles
: значение берется из значения атрибутаroles
(в бд типtext[]
)x-hasura-default-role
: берется первое значение из массива allowed-roles
Запрос от клиента:
{
"hardware_id": "DAHS92KDP",
}
При авторизации с использованием Hardware ID нужно найти в БД в таблице fridges
объект с таким же значение аттрибута hardware_id
. Если объект найден, то авторизуем, если нет, то возвращаем ошибку.
x-hasura-allowed-roles
: значение всегда["fridge"]
x-hasura-default-role
: значение всегдаfridge
А как же рефрешь токен, проверка того что он будет использоваться только один раз, инвалидация рефрешь токена после выхода, множесвенные рефрешь токены?
Ну и естсвенно куки для вебклтиента, без них увы в вебе будут хранить токены в localstorage что гразит xss