#php #json #authentication #jwt #slim
#php #json #аутентификация #jwt #тонкий
Вопрос:
Говорят, что это мой первый проект с использованием скелета фреймворка slim 3
Существует также скелетный проект, который даст вам быстрый старт для примера приложения, поэтому используйте его, если вы предпочитаете просто иметь что-то работающее, а не изучать, как работают все движущиеся части.
В реальной жизни так сложно интегрировать промежуточное программное обеспечение для проверки подлинности веб-токена JSON.
Я пытаюсь следовать шаг за шагом в руководстве, но все еще не работает. Пожалуйста, помогите мне?
это мой код
middleware.php
$app->add(new SlimMiddlewareJwtAuthentication([
"path" => "/",
"passthrough" => "/test",
"secret" => "thisissecret"
]));
и мой / route
routes.php
$app->get('/',AppMemberController::class);
но результат похож на это изображение ниже, 401: неавторизованный
Ответ №1:
Вы неправильно понимаете параметр secret
. Это не токен. Это секретный ключ, который вы используете для подписи токена.
То, как вы генерируете токен, зависит от вас. Например, есть онлайн-инструмент. Вы также можете сгенерировать токен с помощью PHP.
use FirebaseJWTJWT;
$payload = [
"sub" => "user@example.com"
];
$token = JWT::encode($payload, "thisissecret", "HS256");
Перед использованием JWT рекомендуется прочитать это введение.
Ответ №2:
1. Сгенерируйте токен
Использование firebase/php-jwt
$payload = [
"sub" => "user@example.com"
];
$token = JWT::encode($payload,'JWT-secret-key');
2. .Изменения htaccess
При использовании Apache добавьте следующее в файл .htaccess. В противном случае PHP не будет иметь доступа к авторизации: заголовок носителя
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
3. Промежуточное программное обеспечение
$app->add(new SlimMiddlewareJwtAuthentication([
"path" => "/api",
"passthrough" => ["/test"],
"secret" => "JWT-secret-key",
"secure" => false,
"callback" => function ($request, $response, $arguments) use ($container) {
$container["jwt"] = $arguments["decoded"];
},
"error" => function ($request, $response, $arguments) {
$data["status"] = "0";
$data["message"] = $arguments["message"];
$data["data"] = "";
return $response
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
}
]));
4. Правильный запрос
5. Неправильный запрос токена
Ответ №3:
если вы используете сервер apache и обслуживаете по протоколу https, то ваш файл .htaccess выглядит следующим образом
RewriteEngine On
RewriteCond %{HTTPS} On
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
# Set the headers for the restful api
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Accept, Origin, Authorization"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT, PATCH"