JWT 401: неавторизованный в платформе Slim 3

#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"