Laravel Vue SPA - 用户退出登录
打赏作者

Laravel Vue SPA - 用户退出登录

Laravel Vue 开发 SPA 应用 >> Laravel Vue SPA - 用户退出登录 视频发布于 2017-11-02

在 SPA 应用当中,用户的退出登录其实包含了两部分的内容,前端部分需要删除 jwt token 和设置用户的认证状态为false,后端部分则需要在数据库里面分别 revoke AccessToken 和 refreshToken,这样才能保证用户在退出登录时没有遗留信息。
15318137744

终于更新了、

zcdll

终于更新了。

jasester

终于更新了,

jasester

当access_token 过期后 要怎么使用refreshToken 去刷新access_token?

JellyBool 回复 jasester

后面两个视频就会讲的

Cwift

vue处理用户登录感觉好麻烦啊…

萧十五郎
const router = new VueRouter({
    mode:'history',
    routes
});

router.beforeEach((to, from, next) => {
    if (to.meta.requiresAuth) {
        console.log(Store.state.AuthUser);
        /*
        * 此时 AuthUser.authenticated 为true
        * {__ob__: Observer}
          authenticated:true
          email:"12345@qq.com"
          name:"12345"
        *
        * */
        console.log(Store.state.AuthUser.authenticated);
        /*
         此时 AuthUser.authenticated 为false
        */

        if (Store.state.AuthUser.authenticated || JWTToken.getToken()) {
            return next();
        } else {
            return next({ name : 'confirm' });
        }
    }

    if (to.meta.requiresGuest) {
        if (Store.state.authenticated || JWTToken.getToken()) {
            return next({ name : 'home' });
        } else {
            return next();
        }
    }
    next();
});

export default router;

Store.state.AuthUser 有值
Store.state.AuthUser.authenticated 始终为false 不知道是什么原因 @JellyBool 有遇到这个问题吗?

JellyBool 回复 萧十五郎

好像没遇到过。这个你从开发者工具的 vuex 那就可以看得很清楚了

萧十五郎 回复 JellyBool

找到问题了 因为调试的时候我是刷新页面看的结果,请求是异步的,导致还没有赋值 控制台就输出结果了 感谢

zzl

老师我觉得把用户数据在登录接口的时候返回后,保存在本地cookie或loclastorage,然后在authUser从本地获取用户数据更合适点,因为在APP组件中的created方法和Login组件中都需要再次请求去获取用户数据,感觉没什么必要。

JellyBool 回复 zzl

可以的,这个看你的解决方案而已

不了了了了了之

怎么样可以在url 输入 /logout 就可以退出登陆并且redirect?
我尝试在controller里检测如果是 wantsjson, 就返回 json response,否则 redirect
但是并不起任何作用?

JellyBool 回复 不了了了了了之

直接在后端处理应该就OK了,另开一条路由

不了了了了了之 回复 JellyBool
Route::post('/logout','Auth\LoginController@logout');

这条路由把post改成get,然后写到 web.php里吗?

JellyBool 回复 不了了了了了之

我觉得理论上是 OK 的。你试试。

不了了了了了之 回复 JellyBool

试了,的确可以跳转。直接输入/logout,但是redirect回login页面的时候会回到登陆状态?我猜想是因为直接输入url的时候,并没有办法让前端token删除,所以才会继续保持登陆?。这个要怎么解决?

JellyBool 回复 不了了了了了之

这个路由下做:
1.revokeToken
2.删除cookie (就是 httpOnly)的 cookie

coolyon

登录请求时,能正确返回token后,得到的auth()->guard(‘api’)->user()是NULL的,为什么呢?我是按照大大的步骤来做的

JellyBool 回复 coolyon

这个路由有在 middleware(‘auth:api’) 里面么?有携带 token 过来访问么

liujun 回复 JellyBool

我也是这个问题。看视频里面也没有写auth:api啊

JellyBool 回复 liujun

主要是看你的路由注册在哪里

liujun 回复 JellyBool

我也是这个问题。看视频里面也没有写auth:api啊

Ericxie

jelly老师,我在TokenProxy.php里面的logout方法里写了两句代码,主要想试试把这个$user变量通过json返回来看看里面的值

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

        return response()->json(['user' => $user]);
    }

但是response 返回的却是一堆html元素,这是为什么呢?

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="csrf-token" content="tra4fG6QHSkDTPErjCTRNkODvXCD3hg1O5CwXzqx">

    <title>Laravel SPA</title>

    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">

    <link rel="stylesheet" href="/css/app.css">

</head>
<body>
<div id="app">
    <app></app>
</div>
<script src="/js/app.js"></script>
</body>
</html>

@jellybool

JellyBool 回复 Ericxie
public function logout(){
        $user = auth()->guard('api')->user();

        return response()->json(['user' => $user]);
    }

确定是触发到这个 logout 方法么? 有没有可能是你的路由触发了其他的方法,或者你的 某个 middleware 拦截了。

Ericxie 回复 JellyBool

谢谢老师,果然是没正确触发到这个方法,我在axios 里面用了get 请求方式,但是应该用的是post

Ericxie

jelly老师, TokenProxy.php 中的

app('cookie')->forget('refreshToken');

作用是什么呢?
我查看了数据库,这个cookie的记录没有被删除,过期时间也没有被修改。那么这句代码的作用是什么呢?

@jellybool

JellyBool 回复 Ericxie

你看看浏览器刷新之后,还有没有 refreshToken 这个值

Ericxie 回复 JellyBool

老师我刷新了之后,localstorage里面的jwt_token是删除了,但是cookies下的refresh token 的值还在,这是为什么呢?是不是我看的地方不对?@jellybool

Ericxie 回复 JellyBool

发现可以把cookie设置成为空开解决这个问题 (‘refresh_token’, ‘’, 0, ‘’, ‘’, false, true);

JellyBool 回复 Ericxie

阔以阔以,这个方法感觉很 trick

cheng91jing 回复 Ericxie

cookie没有正常删除的原因的是没返回给客户端


$access_token->revoke();
return response()->json([
        'message' => 'logout!'
 ], 204)->cookie($cookie);