Добрый день. Так получается, что на страницах сайта часть информации нужно получать через AJAX из БД того же сайта. Я подумал, что хорошей идеей будет использовать собственный API, потому что он как раз отдаёт информацию в удобном json, ну и в целом не нужно лишнего писать.
Но не могу понять, что делать с аутентификацией - как я понял, есть 3 метода, но они все не подходят, потому что исходники JS в открытом виде и ни токен ни логин с паролем использовать нельзя.
отсюда у меня 2 вопроса:
1) как настроить работу REST API с использованием сессии? проблем с безопасностью я не вижу, авторизация должна будет отсекать излишне любопытных, ну а пользоваться сайтом в принципе будут исключительно авторизованные пользователи.
2) просто из любопытства: как вообще принято поступать в случаях, когда невозможно использовать сессии, но хочется использовать чей-то API с аутентификацией с помощью JS?
Хочу использовать сессии для аутентификации
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Хочу использовать сессии для аутентификации
1) Она по умолчанию работает. Не нужно ничего настраивать.
2) JWT или другой токен с bearer-аутентификацией.
2) JWT или другой токен с bearer-аутентификацией.
Нравится Yii? Давайте сделаем его лучше!.
Re: Хочу использовать сессии для аутентификации
дошли руки до авторизации API, API реализован как модуль, сессии включены (я даже в настройках модуля на всякий случай дополнительно включил сессии)
настройки контроллера API:
но в результате если добавить верный access-token, то всё работает - и при внешнем обращении к API, и при запросах с самого сайта
а вот если я делаю запрос из сайта через AJAX и не указываю токен, получаю ошибку 401.
вот что я сделал в итоге:
таким образом, если запрос к 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;
}
а вот если я делаю запрос из сайта через 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;
}
как считаете, я правильно сделал?
Re: Хочу использовать сессии для аутентификации
а, вот как это в user:
так что, теоретически, у меня даже сохраняется возможность контроля доступа по ID
Код: Выделить всё
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]);
}