Успешно сгенерирован токен, но все еще неавторизован при его использовании

Обновление с исправлением для людей с той же проблемой:

Наконец-то я получил авторизацию токена, чтобы работать. Я считаю, что проблема могла быть в том, что в моем UserController.php я поместил

$this->middleware('auth);

в моем методе __construct. Я не создавал оригинальное приложение Laravel, но я считаю, что это промежуточное программное обеспечение исходит оттуда, поскольку требовался логин, создающий файл cookie сеанса.

Теперь мой код, размещенный ниже, работает отлично!


Исходное сообщение

Как вы могли видеть из моей истории сообщений, эта проблема уже какое-то время меня беспокоит, и я чувствую, что уже все перепробовал, так что я снова здесь. Проблема:

Я настроил свой сервер авторизации с помощью laravel-паспорта, подключившись к серверу API. Из React SPA я вызываю сервер авторизации (используя axios, если это имеет значение), где я отправляю имя пользователя (которое является электронной почтой) и пароль, и, если он принят, возвращает токен доступа. Все это работает, и теперь я хочу отправить запрос на получение данных с помощью моего токена доступа. Это делается с помощью следующего кода:

var config = {
  headers: { 'Authorization': "Bearer " + accessToken }
};
await axios.get('http://apiServer/api/details', {data: 'data'}, config)
  .then(response => {
    console.log('user: ', response)
  })

который называет маршрут

Route::middleware('auth:api')->group(function () {
  Route::get('/user', 'ApiController@getUser');
});

который вызывает функцию

    public function details()
{
    $user = Auth::user();
    return response()->json(['success' => $user], 200);
}

Это не работает, и я получаю неавторизованное сообщение (401). Токен API выглядит правильно, и я почти уверен, что вызов axios имеет правильный синтекс (часть data: 'data' просто проверяет, не читает ли аргумент конфигурации как аргумент данных).

Я также попытался явно использовать токен предоставления пароля, используя сконструированный клиент предоставления пароля, но это дает ту же ошибку.

Единственное, что выглядит подозрительно, это то, что оба моих клиента oauth имеют значение user_id null. Я не уверен на 100% в том, как они работают, поэтому я спросил об этом здесь. Крис Келкер дал ответ, на который я надеялся, но мне не удалось его реализовать, так как я не уверен, как напрямую изменять файлы oauth в паспорте, и если я вообще должен это делать.

При необходимости я могу предоставить дополнительный код и надеюсь, что не слишком много спамлю по этой проблеме.

Заранее спасибо, Ричард.

По запросу, вот код, генерирующий токен:

    public function loginToken()
{
    if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
        $user = Auth::user();

        $success['token'] = $user->createToken('MyApp')->accessToken;
        return response()->json(['success' => $success], 200);
    } else {
        return response()->json(['error' => 'Unauthorised'], 401);
    }
}

Код для получения токена в моем приложении реакции:

const accessTokenData = await axios.post('http://my-app/api/loginToken', {email: '[email protected]', password: 'myPassword'});
const accessToken = accessTokenData.data.success.token;

person Richard Jensen    schedule 11.03.2019    source источник
comment
Вместо этого используйте конечную точку паспорта '/ oauth / token'. Вам не нужно определять второй настраиваемый API для работы с токенами аутентификации.   -  person Mukeyii    schedule 12.03.2019
comment
Спасибо за ваш комментарий! К сожалению, это дает ту же ошибку. Я успешно сгенерировал токен доступа, но при его использовании (как в первом коде axios в OP) я получаю 401 (Unathorized).   -  person Richard Jensen    schedule 18.03.2019


Ответы (2)


Можете ли вы, например, выйти из системы, через которую вы отправляете. Возможно, вы не обновляете переменную держателя токена перед отправкой.

person Wisani Salani    schedule 11.03.2019
comment
Конечно, и я уже это сделал. При тестировании я регистрирую токен непосредственно перед его использованием, и он всегда показывает, что выглядит правильным. - person Richard Jensen; 11.03.2019
comment
это { 'Authorization': "Bearer " + accessToken } или сторонний auth_token? Что генерирует ваш токен? Вы можете принять свой токен за базовый токен. Вы не используете JWT? - person Wisani Salani; 11.03.2019
comment
Да ладно, я не включил код, в котором генерирую токен. Добавлю в ОП. - person Richard Jensen; 11.03.2019

Обновление с исправлением для людей с той же проблемой:

Наконец-то я получил авторизацию токена, чтобы работать. Я считаю, что проблема могла быть в том, что в моем UserController.php я поместил

$ this-> промежуточное ПО ('авторизация); в моем методе __construct. Я не создавал оригинальное приложение Laravel, но я считаю, что это промежуточное программное обеспечение исходит оттуда, поскольку требовался логин, создающий файл cookie сеанса.

Теперь мой код, размещенный ниже, работает отлично!

person Richard Jensen    schedule 08.04.2019