Хочу использовать сессии для аутентификации

Всё что касается построения API
Ответить
TopClans
Сообщения: 23
Зарегистрирован: 2019.04.27, 10:44

Хочу использовать сессии для аутентификации

Сообщение TopClans » 2019.07.16, 15:00

Добрый день. Так получается, что на страницах сайта часть информации нужно получать через AJAX из БД того же сайта. Я подумал, что хорошей идеей будет использовать собственный API, потому что он как раз отдаёт информацию в удобном json, ну и в целом не нужно лишнего писать.
Но не могу понять, что делать с аутентификацией - как я понял, есть 3 метода, но они все не подходят, потому что исходники JS в открытом виде и ни токен ни логин с паролем использовать нельзя.
отсюда у меня 2 вопроса:
1) как настроить работу REST API с использованием сессии? проблем с безопасностью я не вижу, авторизация должна будет отсекать излишне любопытных, ну а пользоваться сайтом в принципе будут исключительно авторизованные пользователи.
2) просто из любопытства: как вообще принято поступать в случаях, когда невозможно использовать сессии, но хочется использовать чей-то API с аутентификацией с помощью JS?

Аватара пользователя
samdark
Администратор
Сообщения: 9251
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Хочу использовать сессии для аутентификации

Сообщение samdark » 2019.07.17, 00:48

1) Она по умолчанию работает. Не нужно ничего настраивать.
2) JWT или другой токен с bearer-аутентификацией.

TopClans
Сообщения: 23
Зарегистрирован: 2019.04.27, 10:44

Re: Хочу использовать сессии для аутентификации

Сообщение TopClans » 2019.10.23, 17:07

дошли руки до авторизации API, API реализован как модуль, сессии включены (я даже в настройках модуля на всякий случай дополнительно включил сессии)
настройки контроллера API:

Код: Выделить всё

public function behaviors()
	{
		$behaviors = parent::behaviors();
		$behaviors['authenticator']['class'] = CompositeAuth::className();
		$behaviors['authenticator']['authMethods'] = [
			[
				'class' => QueryParamAuth::className(),
				'tokenParam' => 'access-token'
			],
			HttpBasicAuth::className(),
			HttpBearerAuth::className(),

		];
		$behaviors['contentNegotiator'] = [
			'class' => 'yii\filters\ContentNegotiator',
			'formats' => [
				'application/json' => Response::FORMAT_JSON, //чтобы возвращало ответ в JSON
			]
		];
		return $behaviors;
	}
но в результате если добавить верный access-token, то всё работает - и при внешнем обращении к API, и при запросах с самого сайта
а вот если я делаю запрос из сайта через AJAX и не указываю токен, получаю ошибку 401.

вот что я сделал в итоге:

Код: Выделить всё

public function behaviors()
	{
		$behaviors = parent::behaviors();
		$behaviors['contentNegotiator'] = [
			'class' => 'yii\filters\ContentNegotiator',
			'formats' => [
				'application/json' => Response::FORMAT_JSON, //чтобы возвращало ответ в JSON
			]
		];
		if (Yii::$app->user->isGuest)
		{
			$behaviors['authenticator']['class'] = CompositeAuth::className();
			$behaviors['authenticator']['authMethods'] = [
				[
					'class' => QueryParamAuth::className(),
					'tokenParam' => 'access-token'
				],
				HttpBearerAuth::className(),

			];

		}
		return $behaviors;
	}
таким образом, если запрос к API исходит с сайта (а сайт закрытый, и им пользуются только авторизованные пользователи), то никакой проверки аутентификации не происходит. если же это гость, то его аутентифицируем.
как считаете, я правильно сделал?

TopClans
Сообщения: 23
Зарегистрирован: 2019.04.27, 10:44

Re: Хочу использовать сессии для аутентификации

Сообщение TopClans » 2019.10.23, 17:10

а, вот как это в user:

Код: Выделить всё

public static function findIdentityByAccessToken($token, $type = null)
	{
		if(Yii::$app->user->isGuest)
		{
			return static::findOne(['access_token' => $token]);
		}
		return static::findOne(['id' => Yii::$app->user->id]);
	}
так что, теоретически, у меня даже сохраняется возможность контроля доступа по ID

Ответить