Laravel Vue SPA - 修改 bug
打赏作者

jasester

可不可以讲一下,在vue中 怎么实现用户的权限,比如每个用户显示的菜单是不同的

juzai123 回复 jasester

你在拿到用户信息之后 用v-if去控制不同的菜单渲染就可以啦

jasester 回复 juzai123

我现在是,在登录成功后,拿去用户信息的同时,拿去该用户的已经授权的菜单。不知道对不对

4143920

好像添加
app(‘cookie’)->queue(app(‘cookie’)->forget(‘refreshToken’));
这行之后 发送的请求还带有旧的refreshToken

JellyBool 回复 4143920

我仔细看看,理论上就是这样删除 cookie 的

4143920

$user = auth()->guard(‘api’)->user();
返回的一直是空

JellyBool 回复 4143920

有携带 access_token 发起请求么

4143920 回复 JellyBool

怎么携带 access_token 发起请求呢

JellyBool 回复 4143920
axios.interceptors.request.use(function (config) {
    if (jwtToken.getToken()) {
        config.headers['Authorization'] = 'Bearer ' + jwtToken.getToken();
    }
    return config;
}, function (error) {
    // Do something with request error
    return Promise.reject(error);
});

app.js 有没有类似这样的代码?你的 access_token 正确保存到 localStorage 里面了么

4143920 回复 JellyBool

有的 一模一样

JellyBool 回复 4143920

那怎么会取不到 user 呢? auth.php 有配置正确?把相关代码贴上来看看?

4143920 回复 JellyBool
'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

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

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],
'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
JellyBool 回复 4143920

感觉是你的 access_token 没保存正确?或者确认一下请求是否有携带 access_token

4143920 回复 JellyBool

/user 可以取到值 在logout的controller里 通过auth不行

JellyBool 回复 4143920

你指定一下 middleware 呗

以后问问题,把相关代码都贴上来吧

4143920 回复 JellyBool

代码都在这里https://github.com/Tim1023/Vue-laravel-jwt-spa

JellyBool 回复 4143920

哎。。。你在 logout 那加个 middleware(‘auth:api’) 试试

4143920 回复 JellyBool

Route::middleware(‘auth:api’)->post(’/logout’,‘Auth\LoginController@logout’);
这样吗? 好像还是不行 提示Unauthenticated

4143920 回复 JellyBool

找到问题了…在前端,token在发请求之前就删除了,但是logout发送请求之后还是有存在旧cookie refreshToken

JellyBool 回复 4143920

所以叫你把代码贴出来啊

4143920 回复 JellyBool

我把logout 改成 这样 可以了

public function logout()
{
$user = auth()->guard(‘api’)->user();

    $accessToken = $user->token();

    app('db')->table('oauth_refresh_tokens')
        ->where('access_token_id',$accessToken->id)
        ->update([
            'revoked' => true,
        ]);
    
    $accessToken->revoke();

    return response()->json([
        'message' => 'logout!'
    ],204)->cookie('refreshToken', '', 0, null);
}
tdhao 回复 4143920

也可以直接 $request->user()

4143920

api.php 里面是 post logout 在其他地方是 get logout 没有在tokenproxy中进行logout()

JellyBool 回复 4143920

在其他地方是 get logout

这是什么?不是统一的发起 post logout 的么

4143920 回复 JellyBool

我自己打错了 =…= 都应该是post

tdhao

router.beforeEach((to, from, next) => {
if(to.meta.requireAuth) { // 判断该路由是否需要登录权限
console.log(Store.state.AuthUser.authenticated);
if(Store.state.AuthUser.authenticated ) {
return next();
} else {
return next({‘name’ : ‘login’});
}
}
在路由钩子这里,打印 Store.state.AuthUser.authenticated;
如果在页面上通过router-link点击,打印是 true;在浏览器回车刷新,就是 false;不知为何

JellyBool 回复 tdhao

正常就是这样的,因为浏览器刷新的时候,还没进入 vuex 吧

tdhao 回复 JellyBool

是的,是我对 vuex 没有理解正确

tdhao 回复 JellyBool

我删除了 if(Store.state.AuthUser.authenticated ) { 中的 || jwtToken.getToken() ,这部分感觉值得商榷

tdhao 回复 JellyBool

我把 if(Store.state.AuthUser.authenticated ) { 中的 || jwtToken.getToken() 去掉了,因为客户端完全可以自己写一个 jwt_token 到 localStorage 里面,虽然不能真实的通过后台验证,但是能伪造访问 vue 页面;但是这样在通过地址栏刷新的时候,就会跳出登陆,走 return next({‘name’ : ‘login’}); 貌似没有两全的方法 …

不了了了了了之

所以这个报错提醒要怎么避免掉?

app.js:8875 GET http://hub.gcc.dev/api/user 401 (Unauthorized)
JellyBool 回复 不了了了了了之

什么时候的呢?我觉得整个过程中貌似总会有一次

不了了了了了之 回复 JellyBool

我去提个问题好了,然后写一下具体的情况
问题在这里

不了了了了了之
        Passport::tokensExpireIn(Carbon::now()->addMinutes(1));

        Passport::refreshTokensExpireIn(Carbon::now()->addMinutes(5));

我修改了它的时限以后,等时间一到,就会出现这样的错误

console就会一直报错Unauthorized

这种情况要怎么处理?我本来想的是如果refresh token过期了的话,就应该logout然后用户手动login

我的新发现是无痕浏览模式下就不会一直包这样的错,要不然就是重新给一个access token,要不然就是退出,要求用户重新登录。

所以这是chrome正常模式下无法等出?
这个怎么避免