首页 > 解决方案 > 将 JWT 与 Laravel 和 Axios 一起使用时,JWT 可以工作,但其他路由总是返回 401 Unauthenticated

问题描述

我已经在 Laravel 中成功实现了 JWT,一切正常。登录,注销。

但是每次我想在我的路由中添加一个新路由routes/api.php并尝试将它与控制器一起使用时,我都会得到一个401 Unauthenticated. 似乎控制器没有被寻址,因为没有var_dump回来。

我的config/auth.php

'guards' => [
   'web' => [
       'driver' => 'session',
       'provider' => 'users',
   ],

   'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

我的请求:

let myConfig = {
    headers: {
        Authorization: "Bearer " + 'JWT_SECRET'
    }
}

axios.get('http://localhost/api/getcashboxes', myConfig)
.then(res => {
    console.log(res.data)
}).catch(err => {
    console.log(err)
})

我的routes/api.php

use Illuminate\Http\Request;

Route::get('getcashboxes', 'CashboxController@getcashboxes')->name('getcashboxes');

Route::group(['prefix' => 'auth'], function ($router) {

    Route::post('login', 'AuthController@login');
    Route::post('logout', 'AuthController@logout');
    Route::post('refresh', 'AuthController@refresh');
    Route::post('me', 'AuthController@me');

});

我的CashboxController.php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class CashboxController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
        //$this->middleware('auth:api'); //Does not work too
    }

    public function getcashboxes()
    {
        var_dump("Hello World :)");
    }
}

请求头:

Accept
    application/json, text/plain, 
Accept-Encoding
    gzip, deflate
Accept-Language
    de,en-US;q=0.7,en;q=0.3
Authorization
    Bearer 5zqyH1BrQUbiDRefurc5XaduzaTyCXPlcPXbodDHhsgdjJHU1dDHhsgdjefur
Cache-Control
    max-age=0
Connection
    keep-alive
Cookie
    XSRF-TOKEN=eyJpdiI6IlVjRFwvYkRvaSs3cDBCVFkxMFZtZkhRPT0iLCJ2YWx1ZSI6Imw4WlZ3RlwvVjNQemZOaTRQXC84MDlrd01uc0dFeUZ4eCtuR29jcWFqTGZBY3RkdzdFdFpzWjB4UDZOQzhQYXRTUCIsIm1hYyI6ImE5ODFkODM1ODU3M2Q3ZDEyZDY1NjdiYTY3ZGJkN2FlNGIzYWRiZTcxNjI4ODc3MmZkYzg3MGZjMzhmODlhODkifQ%3D%3D; buywatchvue_session=eyJpdiI6IjFSb25ZdmthalF2Tm1TWjM4cnUzRkE9PSIsInZhbHVlIjoiQms0SDNGNlFPcXM1YVR2MTZzeEJpRkc1MnlPeFlGOW5IRlRVR0pTZWI3MUk2XC9RMUdsYVp5SWQyTnJRcitoazIiLCJtYWMiOiI0ZmYyNjQxOWY0NjAxNzM4NzY2YzBmYjY2Mjc2OTcyNTE0ZjVkYzdlMDU2YzE0MWE4Y2U2MzZmNTFkNzU2MWY4In0%3D; laravel_session=eyJpdiI6Ik4wNGRJM3Q5QU5KRUlIbWZoaUE4VkE9PSIsInZhbHVlIjoiNmNLb09JeU5DRksxM1VNMElPNDNQb1NseVNJYWdTdXpZdnZyS1RuMlVRY043OUJcLzREMXhkaWR3TmR6ZklWaWIiLCJtYWMiOiJmYWViNzIxMmZjYTU1N2UwYmI2OTU3YzAyNmFmNzM3NjAyMzY5N2Q2MTAyMzEwNzc1MDZlZWQzMjE4YWZiN2UyIn0%3D
Host
    localhost
Referer
    http://localhost
User-Agent
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
X-CSRF-TOKEN
    DClSR93LzbeM4SZQ9OzZJ89s5jtiNFOfkWabYMSJ
X-Requested-With
    XMLHttpRequest
X-XSRF-TOKEN
    eyJpdiI6IlVjRFwvYkRvaSs3cDBCVFkxMFZtZkhRPT0iLCJ2YWx1ZSI6Imw4WlZ3RlwvVjNQemZOaTRQXC84MDlrd01uc0dFeUZ4eCtuR29jcWFqTGZBY3RkdzdFdFpzWjB4UDZOQzhQYXRTUCIsIm1hYyI6ImE5ODFkODM1ODU3M2Q3ZDEyZDY1NjdiYTY3ZGJkN2FlNGIzYWRiZTcxNjI4ODc3MmZkYzg3MGZjMzhmODlhODkifQ==

答案标题:

Cache-Control
    no-cache, private
Connection
    Keep-Alive
Content-Length
    30
Content-Type
    application/json
Date
    Sat, 22 Aug 2020 14:12:25 GMT
Keep-Alive
    timeout=5, max=99
Server
    Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.0
Vary
    Authorization
X-Powered-By
    PHP/7.3.0

任何人的想法?

标签: laravelaxiosjwt

解决方案


你可以创建一个 axios 的实例并像我一样使用它。

const instance = axios.create({
baseURL: 'http://localhost/api'
});

instance.defaults.headers.common['Authorization'] = `Bearer ${token}`;

instance.get('/getcashboxes')
.then(res => {
console.log(res.data)
}).catch(err => {
console.log(err)
 })

如果它可以帮助您解决问题,请告诉我。


推荐阅读