Ответ 1
Информация о работе с интерфейсами безопасности
Сосредоточьте решение, которое обеспечивает все хорошие (RESTful) файлы auth сразу, что, вероятно, будет:
- SSL (самый ВАЖНЫЙ, иначе "HTTP-Auth" будет меньше, каждый сможет прочитать ваш заголовок/тело запроса Человек-в-середине-атаки)
- oAuth (или лучше oAuth2!)
- HTTP-Auth
- Токены (включая ограниченное время жизни, обновление и, возможно, включение проверки IP/DeviceUID для проверки → если оно мобильное!)
- Соль сгенерированные пароли
- Пользовательские HTTP-заголовки для проверки ID/ENV/CLIENT или того, что когда-либо.
- Зашифрованные данные тела для запроса и ответа для предотвращения манипуляций с данными
Подсказка: Персональные данные пользователя должны быть зашифрованы!
Возможно решение
Вы можете видеть стандартную информацию о интерфейсах безопасности. Чтобы обеспечить прочную защиту, вы можете попробовать это, как в следующей части. Я не уверен в вашей AppSidePeritence. Возможно, это sqlLite или что-то в этом роде. Вот почему я не указываю на основе кода DB-Schema, как я это делал для Yii. Вам понадобится хранение/сохранение в приложении Yii (бэкэнд), а также внутри вашего приложения (клиента) для хранения времени и токенов.
Ваш YiiDBModel
-- -----------------------------------------------------
-- Table `mydb`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`user` (
`id` INT NOT NULL,
`username` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`lastLogin` DATETIME NULL,
`modified` DATETIME NULL,
`created` DATETIME NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
----------------------------------------------------
-- Table `mydb`.`authToken`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`authToken` (
`id` INT NOT NULL,
`userId` INT NOT NULL,
`token` VARCHAR(255) NOT NULL,
`created` DATETIME NOT NULL,
PRIMARY KEY (`id`, `userId`),
INDEX `fk_authToken_user_idx` (`userId` ASC),
UNIQUE INDEX `token_UNIQUE` (`token` ASC),
CONSTRAINT `fk_authToken_user`
FOREIGN KEY (`userId`)
REFERENCES `mydb`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Ваш AppPeritenceModel
Обработка вашего маркера справа и обеспечение безопасности входа
- Любой маркер, который вы создаете на стороне Yii-приложения, будет храниться с помощью "созданного" -Datetime в вашей YiiApp-базе данных (см. таблицу authToken). У каждого пользователя есть только один "токен", который будет создан после правильного "входа" -Request. Таким образом, вам не нужно проверять токены во время "входа". Определенный схемой, "токен" уникален! Я думаю, что нет необходимости обрабатывать исторические данные (старые токены, срок действия которых истек).
-
После того как пользовательский логин был подтвержден как "успех" от Yii, вы создаете новый токен пользователя с текущей меткой времени, которая будет храниться в вашей YiiApp-DB. В вашем YiiApp вам нужно настроить "время истечения", которое будет добавлено в текущую временную метку, например, если вы хотите использовать "отметки времени": текущая временная метка:
1408109484
, и ваше время истечения срока действия равно3600
(что составляет 3600 сек = 1 час). Итак... ваше время истечения срока действия, которое будет отправляться через API,(1408109484+3600)
. Btw. Подсказка: вам не нужно отправлять такие атрибуты, как"code": 200
. Коды ответов включены в ваши запросы/данные ответа-заголовка.** 200 OK Response-Example, после того, как пользователь-логин прошел успешно, содержит рассчитанный "expired" -date: **
{ "error": null, "content": { "expires": 1408109484, "token": "633uq4t0qdtd1mdllnv2h1vs32" } }
-
Важно: каждый запрос, который вы хотите защитить, должен быть отправлен с созданным пользователем "токеном". Скорее всего, это будет храниться в вашем устройстве. Вы можете обрабатывать свои "состояния входа" - действительно RESTful, если вы используете HTTP-Response-Codes, например, 200 OK (если все штраф) или 401 (не авторизовано, пользователь не зарегистрирован или сессия истекла). Вы должны подтвердить свой Пользовательский запрос на стороне Yii. Прочитайте токен из входящих запросов, подтвердите его из-за данных токенов в базе данных и сравните "созданный" -DB с текущим входящим запросом времени (HTTP-запросы).
** Запрос-пример, схема по умолчанию для любых запросов безопасности: **
{ "token": "633uq4t0qdtd1mdllnv2h1vs32" "content": { "someDataYouNeed" : null } }
** 401 Несанкционированный ответ - пример, токен истек: **
{ "error": 1, // errorCode 1: token is expired "content": { "someDataYouNeed" : null } }
** 401 Unauthorized Response-Example, пользователь не вошел в систему (в YiiDB нет токена): **
{ "error": 2, // errorCode 2: user is not logged in "content": { "someDataYouNeed" : null } }
-
Сохранить сеанс пользователя? Это довольно просто. Просто обновите "created" -Date в
authToken
-Table до текущего времени запроса. Выполняйте это каждый раз, действительный запрос был отправлен пользователем. Таким образом, сеанс не истечет, если пользователь все еще активен. Убедитесь, что ваш токен-маркер не истек, перед обновлением поляexpires
-Date в БД. Если никакой запрос не будет отправлен во время истечения срока действия сеанса, сохранение будет невозможно.Извините, но добавление PHP-кодов было бы слишком большим.