В приложении 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?