将JWT与Laravel和Axios一起使用时,JWT可以工作,但其他路由始终返回401个未经验证的路由

将JWT与Laravel和Axios一起使用时,JWT可以工作,但其他路由始终返回401个未经验证的路由,laravel,axios,jwt,Laravel,Axios,Jwt,我已经在Laravel成功地实现了JWT,一切都很好。登录,注销 但是每次我想在我的routes/api.php中添加一个新路由并尝试将其与控制器一起使用时,我都会得到一个401未经身份验证的。似乎控制器没有被寻址,因为没有var\u dump返回 我的config/auth.php 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ],

我已经在Laravel成功地实现了JWT,一切都很好。登录,注销

但是每次我想在我的
routes/api.php
中添加一个新路由并尝试将其与控制器一起使用时,我都会得到一个
401未经身份验证的
。似乎控制器没有被寻址,因为没有
var\u dump
返回

我的
config/auth.php

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

   'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
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');

});
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 :)");
    }
}
我的请求:

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

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

   'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
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');

});
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 :)");
    }
}
My
CashboxController.php

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

   'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
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');

});
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


有人有想法吗?

你可以创建一个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)
 })

请让我知道它是否有助于您解决问题。

您可以创建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)
 })

请让我知道它是否有助于解决问题。

我找到了解决方案。这是因为缺乏关于JSON Web令牌(JWT)如何工作的知识

简单解释原则: 如果用户从服务器登录,他将获得JWT。现在必须将此JWT作为cookie或本地存储保存在客户端。这对于以后的服务器查询是必需的

如果向服务器发送需要授权的请求,则必须在头中发送JWT

因此,它必须从cookie或本地存储中读取。使用
Laravel
Vue
Vuex
Axios
local storage
时,它可以如下所示:

从服务器获取令牌(
AuthController.php
):

vuex(
store.js
)中的登录变异:

获取本地用户,包括JWT令牌:

function getLocalUser() {
    const userStr = localStorage.getItem("user");

    if(!userStr) {
        return null;
    }

    return JSON.parse(userStr);
}
使用本地存储中的JWT令牌创建axios请求:

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

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

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


我希望我能在这方面帮助别人。另外还有更多关于JWT的信息。感谢乔纳森·阿克维蒂·奥肯的灵感。

我找到了解决办法。这是因为缺乏关于JSON Web令牌(JWT)如何工作的知识

简单解释原则: 如果用户从服务器登录,他将获得JWT。现在必须将此JWT作为cookie或本地存储保存在客户端。这对于以后的服务器查询是必需的

如果向服务器发送需要授权的请求,则必须在头中发送JWT

因此,它必须从cookie或本地存储中读取。使用
Laravel
Vue
Vuex
Axios
local storage
时,它可以如下所示:

从服务器获取令牌(
AuthController.php
):

vuex(
store.js
)中的登录变异:

获取本地用户,包括JWT令牌:

function getLocalUser() {
    const userStr = localStorage.getItem("user");

    if(!userStr) {
        return null;
    }

    return JSON.parse(userStr);
}
使用本地存储中的JWT令牌创建axios请求:

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

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

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



我希望我能在这方面帮助别人。另外还有更多关于JWT的信息。感谢Jonathan Akwety Okine的灵感。

如果你检查你的邮件头,你看到发送的代币了吗?我将邮件头添加到我的帖子中,我也有类似的问题。我认为正在发生的是,令牌没有到达后端,因此401。我通过使用axios.hm创建默认标题解决了这个问题。你能说明你的意思吗?请检查我的答案,并让我知道它是否对你有帮助。如果你检查标题,你看到发送的令牌了吗?我将标题添加到我的帖子中。我与此问题有类似的问题。我认为正在发生的是,令牌没有到达后端,因此401。我通过使用axios.hm创建默认标题解决了这个问题。你能说明你的意思吗?请检查我的答案,并让我知道它是否对你有帮助。嗯,它不起作用,但是。。。你能告诉我你从哪里得到的
${JWT_SECRET}
,它是什么样子的吗?对我来说,JWT_的秘密就在
.env
中,我只是把它复制出来进行测试。对不起,你为什么说它不起作用?那里的变量应该是标记。很抱歉你拿到代币后把它存放在哪里?我以为那是你传递给你的代币。呃,对不起,不是“不会”,我的意思是“没有”。我现在想知道我是否只是使用了错误的代币。看起来不应该是aaaa.bbbb.cccc吗?如何从.env文件中获取令牌?获取令牌后,能否告诉我您将令牌存储在何处?可能是您使用了错误的令牌,也可能是令牌已过期。是的,jwt代币看起来像aaaa.bbb.cccc。但是你把它放在哪里?嗯,它不起作用,但是。。。你能告诉我你从哪里得到的
${JWT_SECRET}
,它是什么样子的吗?对我来说,JWT_的秘密就在
.env
中,我只是把它复制出来进行测试。对不起,你为什么说它不起作用?那里的变量应该是标记。很抱歉你拿到代币后把它存放在哪里?我以为那是你传递给你的代币。呃,对不起,不是“不会”,我的意思是“没有”。我现在想知道我是否只是使用了错误的代币。看起来不应该是aaaa.bbbb.cccc吗?如何从.env文件中获取令牌?获取令牌后,能否告诉我您将令牌存储在何处?可能是您使用了错误的令牌,也可能是令牌已过期。是的,jwt代币看起来像aaaa.bbb.cccc。但是你把它存放在哪里呢?