laravel - 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 不知道该用户已登录。
我应该将令牌放在哪里?在控制器内部还是登录方法?还是我需要做其他事情?
解决方案
还登录的用户查看只有身份验证用户才能看到的页面。
你是怎么做到的?如果用户可以看到身份验证用户可以看到的内容,这意味着您正在GET
使用身份验证令牌发出请求,对吗?如果您使用的是护照,则应将令牌放入您的 Authorization 标头中。
axios.defaults.headers.common.Authorization = `Bearer ${token}`;
登录后使用它将令牌放入您的所有 axios 请求中,那么您应该一切顺利。
推荐阅读
- amazon-web-services - 包含静态页面的 AWS S3 重定向
- visual-studio-code - 如何在 VS 代码中设置 Flutter android 模拟器
- tensorflow - tf.gradients,如何理解 `grad_ys` 并使用它?
- octave - 八度错误:SparseMatrix::solve 数值因式分解失败
- angular5 - angular5-data-table 错误与分页和排序
- java - 单击列表项到字符串并传输到另一个活动
- vba - MS Access VBA - 查询计算
- android - 防止新意图或切换应用程序破坏活动
- javascript - 使用 PHP 变量的值在 Javascript 中打开一个窗口
- wordpress - Wordpress https:// 损坏的主页和管理区域