首页 > 解决方案 > Laravel Passport 中间件保护路由“未验证”问题

问题描述

我使用 Laravel Passport 进行身份验证,因此我将路由放入中间件保护中。

更新

为了清楚起见,我也添加了 UsersController。

public function getUser()
{
    $users = Auth::user();
    return response()->json($users);
}

//

Route::group(['prefix' => 'v1', 'middleware' => 'auth:api'], function () {
    /* users */
    Route::get('/users', 'Api\UsersController@getUser');

    /* fetch */
    Route::get('/articles', 'Api\ArticlesController@allArticles');
    Route::get('/article/{id}', 'Api\ArticlesController@singleArticle');
});

当然,我需要登录,否则我看不到受保护的路由。我在AuthController里面做了一个控制器登录功能。

控制器

public function login(Request $request)
{
    $http = new \GuzzleHttp\Client;
    try {
        $response = $http->post(config('services.passport.login_endpoint'), [
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => config('services.passport.client_id'),
                'client_secret' => config('services.passport.client_secret'),
                'username' => $request->email,
                'password' => $request->password,
            ]
        ]);
        return $response->getBody();
    } catch (\GuzzleHttp\Exception\BadResponseException $e) {
        if ($e->getCode() === 400) {
            return response()->json('Invalid Request. Please enter a username or a password.', $e->getCode());
        }

        if ($e->getCode() === 401) {
            return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
        }

        return response()->json('Something went wrong on the server.', $e->getCode());
    }
}

在我的 vuex 的前端,我有一个动作调用。

retrieveToken(context, credentials){
    return new Promise((resolve, reject) => {
            axios.post("api/v1/login", {
                email: credentials.username,
                password: credentials.password,
            })
            .then(response => {
                const token = response.data.access_token;
                localStorage.setItem("access_token", token);
                context.commit("retrieveToken", token);
                resolve(resolve);
            })
            .catch(error => {
                console.log(error);
                reject(response);
            })
    })
},

一切都很好。我存储令牌并将其用于登录并删除它以注销。但是在后端,缺少一些东西。因为即使登录,我仍然看不到受保护的路由。Laravel 的 Auth 不知道该用户已登录。

我应该将令牌放在哪里?在控制器内部还是登录方法?还是我需要做其他事情?

标签: laravelvue.jslaravel-5vuejs2laravel-passport

解决方案


还登录的用户查看只有身份验证用户才能看到的页面。

你是怎么做到的?如果用户可以看到身份验证用户可以看到的内容,这意味着您正在GET使用身份验证令牌发出请求,对吗?如果您使用的是护照,则应将令牌放入您的 Authorization 标头中。

axios.defaults.headers.common.Authorization = `Bearer ${token}`;

登录后使用它将令牌放入您的所有 axios 请求中,那么您应该一切顺利。


推荐阅读