Я использую Slim v 3 с JWT для написания REST API. Я последовал за https://github.com/tuupola/slim-jwt-auth и работает нормально.
Я генерирую токен каждый раз, когда пользователь входит в приложение. Для аутентификации пользователя я следовал https://github.com/tuupola/slim-basic-auth использовать в качестве промежуточного программного обеспечения. В случае успеха я генерирую токен, используя https://github.com/firebase/php-jwt.
Я проходил через связанный вопрос о SO здесь, JWT: аутентификация в slim v3 и Android и у меня есть запрос на http основной аутентификации. (У меня нет достаточно представителей, чтобы комментировать там).
Теперь мои вопросы:
HttpBasicAuthentication через опцию ‘users’ работает нормально, но я не смог бы использовать ее против моей таблицы пользователей. Многие пользователи будут входить в приложение, и перечисление их всех в «пользователи» не вариант. Я прямо здесь?
Если да, я должен использовать Pdo Authenticator. Я настроил его, но аутентификация не удалась, и я не смог ее решить. Вызывается ошибка обратного вызова с сообщением «Ошибка аутентификации». В моей базе данных есть таблица ‘users’ с колонками ‘user’ и ‘hash’ для имени пользователя и пароля. Ниже приведен фрагмент кода, который я использую.
use Slim\Middleware\HttpBasicAuthentication; use Slim\Middleware\HttpBasicAuthentication\PdoAuthenticator;
$pdo = new \PDO('mysql:host=localhost;dbname=test', $dbUser, $dbPassword);
$middlewareHttpBasicAuthConfig = [
/*"users" => [
"user1" => "password"],*/
"secure" => false,
"relaxed" => ["localhost", "amruta-pani"],
"path" => "/*",
"passthrough" => Utils::httpAuthPassThroughRoutes,
"realm" => "Protected",
"authenticator" => new PdoAuthenticator([
"pdo" => $pdo
]),
"callback" => function($request, $response, $arguments) {
echo "Through<br>\n";
print_r($arguments);
},
"error" => function($request, $response, $arguments) {
echo "Failed<br>\n";
print_r($arguments);
}
];$app->add(new HttpBasicAuthentication($middlewareHttpBasicAuthConfig));
Я использую Google Advanced Rest Client для тестирования, и вывод, который я вижу,
Failed<br>
Array
(
[message] => Authentication failed
)
Я добавил ниже правило для моего веб-сервера Apache
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Что мне здесь не хватает?
Кажется, вам нужно передать схему именования базы данных в PdoAuthenticator, как описано в Сообщение блога.
В вашем случае это было бы что-то вроде …
"authenticator" => new PdoAuthenticator([
"pdo" => $pdo,
"table" => "users",
"user" => "user",
"hash" => "hash"])
…которые действительно кажутся значениями по умолчанию. Возможно, это не работает из-за простой проблемы с подключением к PDO. Кроме того, глядя на источник, PdoAuthenticator использует password_verify () внутри, поэтому он будет доступен только в PHP 5> = 5.5.0 и PHP 7.
Вы также можете свернуть свой собственный аутентификатор. Что касается вашего вопроса об обработке учетных данных в вашем обратном вызове аутентификатора, вы должны сделать что-то вроде:
class MyAuthenticator implements AuthenticatorInterface {
public function __invoke(array $arguments) {
// $arguments['user'] will contain username
// $arguments['password'] will contain password
// Do stuff...
}
}
@Mika Tuupola помогла мне решить эту проблему в комментариях, и кредит ему достался, и я подумал, что это кому-нибудь поможет. Я надеялся, что он ответит, чтобы я пометил это.
Для работы промежуточного программного обеспечения HTTPBasicAuthentication необходимо хешировать пароли.
Пароли в виде открытого текста не могут быть аутентифицированы с помощью драйвера PDO, однако, если массив конфигурации имеет свойство ‘users’, с паролем в виде открытого текста, как показано ниже, будет работать, что, очевидно, не будет иметь место в производстве.
$app->add(new \Slim\Middleware\HttpBasicAuthentication([
"users" => [
"root" => "t00r",
"somebody" => "passw0rd"]
]));
Документация GitHub на https://github.com/tuupola/slim-basic-auth было достаточно хорошо, чтобы использовать это промежуточное ПО, однако, когда упоминалось о паролях с открытым текстом, цитата —
Пароли в виде открытого текста хороши только для быстрого тестирования. Вы, вероятно…
Я продолжал тестировать его с паролями с открытым текстом с помощью PDO, и он не работал, пока пароль не был хеширован.