Не удалось проверить подпись JWT Token с внешним логином API - PullRequest
1 голос
/ 29 сентября 2019

В приложении Laravel 5.8 / vuejs / vuex / mysql я использую jwt-auth, и когда я вхожу в систему (стандартная авторизация с таблицей пользователей mysql), я использую метод:

export function setAuthorizationToken(token) {
    axios.defaults.headers.common["Authorization"] = `Bearer ${token}`
}

, и все работает нормально.

Далее я переделал SignUp / SignIn, чтобы использовать внешний API для операций SignUp / SignIn.Таким образом, мое приложение должно сделать SignUp / SignIn с внешним API, но у меня также есть запросы на элементы управления моего приложения для чтения / записи данных из / в mysql.

Я переделал запрос SignIn для внешнего API с php curl вуправляющее действие, когда пользователь нажимает кнопку входа, например:

    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

   // I run login method
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($ch, CURLOPT_URL, $this->admindashApi . '/api/login');
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8"));

            $userLoginData = [
                'email'    => $credentials['email'],
                'password' => $credentials['password'],
            ];
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($userLoginData));

            $resp = curl_exec($ch);

            $respArray = json_decode($resp);
            if ( isset($respArray->success) and empty($respArray->success)) { // login fails - return error in responce
                $err = curl_error($ch);
                curl_close($ch);

                $errorsArray     = [$respArray->data];
                $errors_message  = $respArray->data;

                return response()->json([
                    'error_code' => 1,
                    'message'    => $errors_message,
                    'errors'     => $errorsArray,
                    'rows_total' => 0,
                ], HTTP_RESPONSE_BAD_REQUEST /*HTTP_RESPONSE_INTERNAL_SERVER_ERROR*/);

            } //if ( isset($respArray->success) and empty($respArray->success)) { // login fail

            $logged_user_token = $respArray->data->token;
            // if login was successfull I keep token





             // I need to get details of the logged user
            $loggedUser= null;

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($ch, CURLOPT_URL, $this->admindashApi . '/api/user');

            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                "Content-Type: application/json; charset=utf-8",
                "Authorization: Bearer ".$logged_user_token
            ]);


            $resp = curl_exec($ch);

            $respArray = json_decode($resp);
            if ( isset($respArray->success) and empty($respArray->success)) { // details read fails - return error in responce
                $err = curl_error($ch);
                curl_close($ch);

                $errorsArray     = [$respArray->data];
                $errors_message  = $respArray->data;

                return response()->json([
                    'error_code' => 1,
                    'message'    => $errors_message,
                    'errors'     => $errorsArray,
                    'rows_total' => 0,
                ], HTTP_RESPONSE_BAD_REQUEST );

            } //if ( isset($respArray->success) and empty($respArray->success)) {
            $loggedUser= $respArray->data->customer_details;

//            $this->respondWithToken($logged_user_token);

            return response()->json(['error_code' => 0, 'message' => '', "token" => $logged_user_token, 'user'=> $loggedUser ], HTTP_RESPONSE_OK );
            // if user details read was successfull I return logged user

        }   // if( !empty($this->useAdmindashApi) and !empty($this->admindashApi)) {

Но проблема в том, что когда я читаю данные из моей базы данных mysql с помощью элементов управления приложения, я получил

Token Signature не удалосьбыть проверенным

в консоли.Я полагаю, что jwt-auth ничего не знает о токене, который я прочитал из внешнего API в переменной $ logged_user_token.Есть ли способ записать значение из $ logged_user_token в токен jwt-auth в моем элементе управления выше?

"laravel/framework": "5.8.*",
"tymon/jwt-auth": "^1.0.0",


"vue": "^2.5.17",
"axios": "^0.18",
"vuex": "^3.1.0"

Спасибо!

ИЗМЕНЕННАЯ ЧАСТЬ: В маршрутах /api.php У меня есть описанные результаты поиска

Route::group(['middleware' => 'jwt.auth',  'prefix' => 'personal', 'as' => 'personal.'], function ($router) {
    ...
    Route::post('search-results', 'SearchResultsController@remote_search_web');
    ...
});

, и я получил ошибку при первом запросе метода управления, например:

        axios.post(window.API_VERSION_LINK + '/personal/search-results', filters).then((response) => {
            this.is_page_loaded = true
            ...
        }).catch((error) => {
            this.showPopupMessage("Search", error.response.data.message, 'error');
            this.is_page_loaded = true
            this.showRunTimeError(error, this);
        });

ИЗМЕНЕННАЯ ЧАСТЬ № 2: Чтение документов jwt, которые я нашел здесь https://github.com/tymondesigns/jwt-auth/wiki/Authentication:

Конечно, вы также можете вручную установить токен, если это необходимо, если в вашем приложении есть другие точки входа.например, JWTAuth :: setToken ('foo.bar.baz');

Итак, в моем контроле входа в систему, когда я получил токен от внешнего API, я написал:

$logged_user_token = $respArray->data->token;
...
$loggedUser= $respArray->data->customer_details;
\JWTAuth::setToken($logged_user_token);
return response()->json(['error_code' => 0, 'message' => '', "token" => $logged_user_token, 'user'=> $loggedUser ], HTTP_RESPONSE_OK );

Но работаетэтот метод входа и повторение действия элемента управления при чтении данных из БД я получил ту же ошибку:

Подпись токена JWT не может быть проверена.

Я нашел метод у поставщика/tymon/jwt-auth/src/JWT.php:

/**
 * Set the token.
 *
 * @param  \Tymon\JWTAuth\Token|string  $token
 *
 * @return $this
 */
public function setToken($token)
{
    $this->token = $token instanceof Token ? $token : new Token($token);

    return $this;
}

и убедитесь, что параметр $ token может быть Token или строкой, а затем его необходимо преобразовать в объект Token.Но если я отправил строковый токен из внешнего API, как мне его рендерить?

Есть ли у JWT какой-либо метод apply / flash для применения моего нового токена к JWT?

...