dilikpulatov
@dilikpulatov
веб-программист

Как можно защитить свой АПИ в SPA или SSR приложение?

Здравствуйте!
Разрабатываю веб-проект на VueJs(Nuxt JS SSR). Все данные получаю из АПИ(а сам апи сделано на Yii2)
Почти 80% запросы к АПИ идет без авторизации.
Вот и возникает вопрос - как можно защитить открытие АПИ?
Я в этом новичок...если есть идея...советуйте. Можно ли создать какой нибудь токен, когда пользователь открывает сайт и с этим токеном определить откуда идет запрос в бекэнде?
или можно просто сделать фильтр по IP адрес? или адрес сайт $_SERVER['HTTP_REFERER']
  • Вопрос задан
  • 1879 просмотров
Пригласить эксперта
Ответы на вопрос 3
@pqgg7nwkd4
Если хотите защититься от того что-бы кто-то во фронте использовал ваше API, то можно использовать https://developer.mozilla.org/ru/docs/Web/HTTP/CORS.

Если хотите защититься от чьего-то бекэнда - то тут намного сложнее, почти невозможно. Скорее всего это отслеживать и банить. Или при какой-то плотности запросов выдавать запрос на капчу.
Ответ написан
Комментировать
@kirill-93
Вы зря заморачиваетесь. Ваш АПИ - это же просто данные, которые нужны для отрисовки страниц. То есть, если бы не SPA, то у вас все эти данные были бы сразу на странице.
Вам просто не нужно ничего делать.
Ответ написан
Комментировать
Для yii2 есть штатный механизм токенов - bearer token

В своем проекте я создал BaseController наследуемый от ActiveController и в нем метод

public function behaviors()
	{
		$arBehaviors = parent::behaviors();

		$arBehaviors['authenticator'] = [
			'class' => HttpBearerAuth::class,
		];

		$arBehaviors['contentNegotiator'] = [
			'class' => ContentNegotiator::class,
			'formats' => [
				'application/json' => Response::FORMAT_JSON,
			],
		];

		return $arBehaviors;
	}


Во vue отправляется ajax запрос на back с логином/паролем. На back'е примерно такой action
public function actionLogin()
	{
		$model = new LoginForm();

		if ($model->load(Yii::$app->getRequest()->getBodyParams(), '') && $model->login()) {
			$oUser = User::findOne(Yii::$app->user->id);
			$oUser->generateAuthKey();
			$oUser->save();

			$userData = $oUser->toArray();
			unset($userData['password_hash']);
			unset($userData['password_reset_token']);
			return ['access_token' => $oUser->getAuthKey(), 'user' => $userData];
		}
		else {
			$model->validate();
			return $model;
		}
	}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы